2013-07-24 13 views
8

Tôi có lớp đơn giản PersonController cung cấp phương thức save() để tiếp tục đối tượng từ yêu cầu bài đăng http.Spring MockMvc chuyển hướngUrl với mẫu

package org.rw.controller; 

import java.sql.Timestamp; 
import java.util.List; 

import org.rw.entity.Person; 
import org.rw.service.PersonService; 
import org.rw.spring.propertyeditor.TimestampPropertyEditor; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.WebDataBinder; 
import org.springframework.web.bind.annotation.InitBinder; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 


@Controller 
@RequestMapping(value="/person") 
public class PersonController { 

    private static final Logger logger = LoggerFactory.getLogger(PersonController.class); 

    @Autowired 
    private PersonService personService; 

    @Autowired 
    TimestampPropertyEditor timestampPropertyEditor; 


    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Timestamp.class, "dob", timestampPropertyEditor); 
    } 


    @RequestMapping(value="/save", method=RequestMethod.POST) 
    public String save(Model model, Person person) { 
     Long personId = personService.save(person); 
     return "redirect:view/" + personId; 
    } 

} 

Phương thức save() trả về dưới dạng return "redirect:view/" + personId;. Nó sẽ khác nhau đối với mọi yêu cầu. nó có thể giống như "view/5" hoặc "view/6" tùy thuộc vào id của đối tượng đã được duy trì.

Sau đó, tôi có một lớp đơn giản để kiểm tra bộ điều khiển ở trên với chế độ mô phỏng mùa xuân.

package org.rw.controller; 

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 

import org.junit.Test; 
import org.rw.service.UserService; 
import org.rw.test.SpringControllerTest; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 
import org.springframework.security.core.Authentication; 
import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.security.core.userdetails.UserDetails; 

public class PersonControllerTest extends SpringControllerTest { 


    @Autowired 
    private UserService userService; 


    @Test 
    public void add() throws Exception { 
     mockMvc.perform(get("/person/add", new Object[0])).andExpect(status().isOk()); 
    } 


    @Test 
    public void save() throws Exception { 
     UserDetails userDetails = userService.findByUsername("anil"); 
     Authentication authToken = new UsernamePasswordAuthenticationToken (userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities()); 
     SecurityContextHolder.getContext().setAuthentication(authToken); 

     mockMvc.perform(
      post("/person/save", new Object[0]) 
       .param("firstName", "JunitFN") 
       .param("lastName", "JunitLN") 
       .param("gender", "M") 
       .param("dob", "11/02/1989") 
     ).andExpect(
       redirectedUrl("view") 
     ); 
    } 


} 

bây giờ ở đây tôi gặp sự cố redirectedUrl("view") đang từ chối giá trị "view/5". Tôi đã thử redirectedUrl("view*")redirectedUrl("view/*") nhưng không hoạt động.


Edit:

Ở đây tôi đã có một cách giải quyết theo dưới đây

MvcResult result = mockMvc.perform(
    post("/person/save", new Object[0]) 
     .param("firstName", "JunitFN") 
     .param("lastName", "JunitLN") 
     .param("gender", "MALE") 
     .param("dob", "11/02/1989") 
).andExpect(
     //redirectedUrl("view") 
     status().isMovedTemporarily() 
).andReturn(); 

MockHttpServletResponse response = result.getResponse(); 

String location = response.getHeader("Location"); 

Pattern pattern = Pattern.compile("\\Aview/[0-9]+\\z"); 
assertTrue(pattern.matcher(location).find()); 

nhưng tôi vẫn đang tìm kiếm một cách thích hợp.


update:

Tôi đã đăng tải cùng một vấn đề trên spring jira here:

Trả lời

12

Kể từ mùa xuân 4.0 bạn có thể sử dụng redirectedUrlPattern như chỉ bởi Paulius Matulionis

Tính đến mùa xuân 3. x điều này không được hỗ trợ ra khỏi hộp nhưng bạn có thể dễ dàng thêm bạn kết quả phù hợp tùy chỉnh

private static ResultMatcher redirectedUrlPattern(final String expectedUrlPattern) { 
    return new ResultMatcher() { 
     public void match(MvcResult result) { 
      Pattern pattern = Pattern.compile("\\A" + expectedUrlPattern + "\\z"); 
      assertTrue(pattern.matcher(result.getResponse().getRedirectedUrl()).find()); 
     } 
    }; 
} 

Và sử dụng nó như build-in khớp

mockMvc.perform(
    post("/person/save", new Object[0]) 
     .param("firstName", "JunitFN") 
     .param("lastName", "JunitLN") 
     .param("gender", "M") 
     .param("dob", "11/02/1989") 
).andExpect(
     redirectedUrlPattern("view/[0-9]+") 
); 
5

Kể từ 4.0 nó có sẵn trong mùa xuân riêng của mình.

Vui lòng kiểm tra here.

+0

và tại đây https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/web/servlet/result/MockMvcResultMatchers.html#redirectedUrl-java.lang.String- –