Mockito使用不同的集合参数模拟相同的方法调用



我尝试用不同的集合参数模拟相同的方法调用。

我的问题是,我没有从模拟呼叫中得到正确的模拟答案。

测试等级:

@ExtendWith(SpringExtension.class)
public class CollectionTest {
@MockBean
private Controller c;

@BeforeEach
public void init() {
Collection<String> a = Mockito.anyCollection();
a.add("a");
Mockito.when(c.run(a)).thenReturn("a");

Collection<String> b = Mockito.anyCollection();
b.add("b");
Mockito.when(c.run(b)).thenReturn("b");
}
@Test
public void test() {
assertEquals("a", c.run(Lists.newArrayList("a"))); // DOESNT'WORK!!! Returns "b" but should "a"
assertEquals("b", c.run(Lists.newArrayList("b"))); // 
}
}

控制器类别:

@Service
public class Controller{
public String run(Collection<String> c) {
return "not-mocked";
}   
}

我不知道为什么它不回来"a";。我试图将集合更改为字符串,但行为相同。

要获得以下行为,需要采取哪些步骤

@Test
public void test() {
assertEquals("a", c.run(Lists.newArrayList("a"))); // should return "a"
assertEquals("b", c.run(Lists.newArrayList("b"))); // should return "b"
}

Im正在使用Java Mockito";3.1〃;和Spring,但我认为Mockito是这里的重要信息。

您的第二个调用-Mockito.when(c.run(b((.thenReturn("b";正在否决我们的第一个呼叫,因此Mockito将始终返回";b";。如果你需要同一个电话的多个答案,你可以使用varags变体:

when(c.run(anyCollection((((.thenReturn("a","b"(;

现在对控制器的run方法的第一个调用将返回"0";a";并且所有随后的呼叫将返回"0";b";。您可以提供任意数量的返回结果,从那时起,最后一个结果将作为答案重复出现。

编写两个测试将显示您期望的结果。您正在向同一个Controller添加两个不同的结果,因此只得到最后一个结果:Mockito.when(c.run(b)).thenReturn("b");典型的setUp((中最后一个模拟的预期结果将保留在内存中。

之前的回答是:您可以使用junit和mockito之类的东西来测试您的springwebmvc应用程序。看起来是这样的:

@WebMvcTest(controllers = UserController.class)
@ActiveProfiles("test")
class UserControllerTest {

@Autowired                           
private MockMvc mockMvc;  

@MockBean                           
private UserService userService; 

private List<User> userList;       

@BeforeEach                           
void setUp() {                               
this.userList = new ArrayList<>();
this.userList.add(new User(1L, "user1@gmail.com", "pwd1","User1"));
this.userList.add(new User(2L, "user2@gmail.com", "pwd2","User2"));
this.userList.add(new User(3L, "user3@gmail.com", "pwd3","User3"));                                                       
}
}

举个例子:

@Test
void shouldFetchAllUsers() throws Exception {
given(userService.findAllUsers()).willReturn(userList);
this.mockMvc.perform(get("/api/users"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.size()", is(userList.size() )));
}

示例来自@seehttps://medium.com/backend-habit/integrate-junit-and-mockito-unit-testing-for-controller-layer-91bb4099c2a5

最新更新