如何验证在 spring 集成测试中调用了 void 函数
how to verify a void function is been called in spring integration test
我已经编写了一个集成来测试删除功能,如下所示
@Test
void deleteUsersTest() {
Map<String, String> params = new HashMap<>();
params.put("id", "21");
this.template.delete("/v1/users/{id}", params);
:
}
我面临的问题是,因为它是一个空函数,所以我想验证下面的函数是否被内部调用
userRepository.deleteById(21)
在单元测试中我通常使用这样的东西
verify(userRepository, times(1)).deleteById((long) 21);
但上面的是基于 mockito 的函数,我无法在集成测试中使用它
有人可以帮助我如何在 Spring 集成测试
中验证此功能
我正在使用 Spring5,SpringBoot 2.1
我建议使用 @SpyBean, here is the example using spybean
Spy wraps the real bean but allows you to verify method invocation and mock individual methods without affecting any other method of the real bean. So, by making userRepository
a SpyBean we can mock only the methods we want to mock in our test case and leave the others untouched.
另一种方法你也可以使用 @MockBean
创建模拟并使用 thenCallRealMethod()
调用真正的方法
@MockBean
private UserRepository userRepository
然后说调用一个真正的方法
// Call a real method of a Mocked object
when(userRepository.deleteById(21l)).thenCallRealMethod();
所以使用上面的语句其实是调用了真正的方法,现在可以验证一下
verify(userRepository, times(1)).deleteById(21l);
集成测试在真实数据库上进行。只需确保实体在调用 delete
之前存储在您的数据库中,而不是在调用 delete
.
之后存储在您的数据库中
@BeforeEach
public void setDatabase() {
client1 = new Client();
client1.setName("Karl");
client2 = new Client();
client2.setName("Pauline");
testEntityManager.persist(client1);
testEntityManager.persist(client2);
testEntityManager.flush();
}
@Test
public void deleteTest() {
clientRepository.deleteById(client1.getId());
List<Client> clientListActual = clientRepository.findAll();
boolean clientExists = clientListActual.contains(client1);
assertFalse(clientExists);
assertEquals(1, clientListActual.size());
}
我已经编写了一个集成来测试删除功能,如下所示
@Test
void deleteUsersTest() {
Map<String, String> params = new HashMap<>();
params.put("id", "21");
this.template.delete("/v1/users/{id}", params);
:
}
我面临的问题是,因为它是一个空函数,所以我想验证下面的函数是否被内部调用
userRepository.deleteById(21)
在单元测试中我通常使用这样的东西
verify(userRepository, times(1)).deleteById((long) 21);
但上面的是基于 mockito 的函数,我无法在集成测试中使用它
有人可以帮助我如何在 Spring 集成测试
中验证此功能我正在使用 Spring5,SpringBoot 2.1
我建议使用 @SpyBean, here is the example using spybean
Spy wraps the real bean but allows you to verify method invocation and mock individual methods without affecting any other method of the real bean. So, by making
userRepository
a SpyBean we can mock only the methods we want to mock in our test case and leave the others untouched.
另一种方法你也可以使用 @MockBean
创建模拟并使用 thenCallRealMethod()
调用真正的方法
@MockBean
private UserRepository userRepository
然后说调用一个真正的方法
// Call a real method of a Mocked object
when(userRepository.deleteById(21l)).thenCallRealMethod();
所以使用上面的语句其实是调用了真正的方法,现在可以验证一下
verify(userRepository, times(1)).deleteById(21l);
集成测试在真实数据库上进行。只需确保实体在调用 delete
之前存储在您的数据库中,而不是在调用 delete
.
@BeforeEach
public void setDatabase() {
client1 = new Client();
client1.setName("Karl");
client2 = new Client();
client2.setName("Pauline");
testEntityManager.persist(client1);
testEntityManager.persist(client2);
testEntityManager.flush();
}
@Test
public void deleteTest() {
clientRepository.deleteById(client1.getId());
List<Client> clientListActual = clientRepository.findAll();
boolean clientExists = clientListActual.contains(client1);
assertFalse(clientExists);
assertEquals(1, clientListActual.size());
}