我有一些使用MockMvc进行控制器测试的Mockito测试。
控制器正在使用@ControllerAdvice
,其中包含@ModelAttribute
。这是必要的,因为90%的控制器需要很少的属性。
我通过ignoreDefaultModelOnRedirect
从重定向网址清除此信息(似乎比在所有方法中添加RedirectAttributes参数更有效)。
我需要测试redirectUrl。但是在这个URL中我看到了url + redirect属性。我不想与他们核对,因为它不是生产行为的样子。
有没有办法将ignoreDefaultModelOnRedirect
传递给MockMvc?
==已编辑
用户转到问候语 - >重定向到greetingRedirected
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greeting(Model model) {
return "redirect:/greetingRedirected";
}
}
富含@ControllerAdvice
数据的模型
@ControllerAdvice
public class GreetingControllerAdvice {
@ModelAttribute("attr")
public String getAttr() {
return "ATTRIBUTE";
}
}
现在开始简单测试:
@RunWith(MockitoJUnitRunner.class)
public class ApplicationTest {
private MockMvc mockMvc;
@Before
public void setUp() {
GreetingController greetingController = new GreetingController();
mockMvc = MockMvcBuilders.standaloneSetup(greetingController).setControllerAdvice(new GreetingControllerAdvice()).build();
}
@Test
public void greeting() throws Exception {
mockMvc.perform(get("/greeting"))
.andExpect(redirectedUrl("/greetingRedirected"));
}
}
结果是:
java.lang.AssertionError: Redirected URL
Expected :/greetingRedirected
Actual :/greetingRedirected?attr=ATTRIBUTE
我当然可以使用SpringRunner和@Autowire
MockMvc,但MockitoRunner更快(这对于拥有数千个测试的大型项目非常重要)。
我可以摆脱setControllerAdvice(...)
但是它会使行为与大多数情况下的生产行为更不相似(因为我有很多测试没有检查重定向行为)。
最后,我可以在“重定向测试”(带有禁用建议)和“未重定向测试”上拆分测试,但这将非常愚蠢。 :)
所以我问是否有任何简单的方法可以告诉MockMvc / Mockito参数spring.mvc.ignore-default-model-on-redirect
已启用并且应该像预期的那样。