清理Mockito测试中的重定向网址

时间:2018-04-14 07:49:14

标签: java spring spring-mvc mockito mockmvc

我有一些使用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已启用并且应该像预期的那样。

0 个答案:

没有答案