使用mockito matchers anyList()和any(List.class)时的不同结果

时间:2016-12-09 23:25:11

标签: java spring mockito

我发现使用mockito匹配器anyList()和任何(List.class)时会有不同的结果。但是,我无法解释这一点,因为两者实际上应该返回相同的结果。也许有人可以启发我。

我使用匹配器来测试控制器。我的控制器将属性绑定到名为myList的模型。我想验证模型属性实际上是一个列表。

model.addAttribute("myList", Arrays.asList("test"));

any(List.class)执行正确的测试:

mockMvc.perform(get("/")).andExpect(model().attribute("myList", any(List.class)));

但AnyList()返回[]是预期的并导致测试失败:

mockMvc.perform(get("/")).andExpect(model().attribute("myList", anyList()));

我需要anyListOf(String.class)来验证列表是否包含字符串,但由于这种行为我无法使用它。

1 个答案:

答案 0 :(得分:3)

您正在使用ModelResultMatchers.attribute(),它会检查名为“myList”的模型属性是否等于第二个参数,即等于any(List.class)anyList()返回的值。

请注意,此方法根本不需要Mockito匹配器。它根本与Mockito无关。它只需要一个值,并检查model属性是否等于此值。

anyList()返回一个新的空ArrayList。 any(List.class)返回null。因此,您的第一个测试成功,因为您的控制器碰巧在此模型属性中存储了null,而您的第二个测试失败,因为null不等于空ArrayList。

TL; DR:你不应该在这里使用Mockito匹配器。这是没有意义的。