要实现我们的测试,我需要从存储库中检索保存的数据。由于存储库只是一个模拟的存储库,所以我找不到这些数据。
这是我写的代码:
@Mock
private UserRepository userRepository;
public void functionTest(){
User user = new User();
user.setUsername("username");
userRepository.save(user);
List<User> users = functionIwantToTest();
assertThat(users.size(), is(1));
}
public void functionIwantToTest(){
return userRepository.findAll();
}
测试失败,因为该函数将在存储库中找不到任何用户(保存函数不会在存储库中持续数据(
这是一个简单的示例,我真正想要的是测试一个可以从UserRepository检索特定用户的函数,因此我需要在此处模拟一些数据。
我将PostgreSQL用作运行时数据库。当我运行测试时,是否有可能自动使用内存DB(例如H2数据库(?因此,我可以从数据库中保存和检索数据,而无需@mock注释?
是的,您可以在测试过程中使用H2。首先在pom.xml
中添加对H2的依赖性
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
要在测试中启用H2您可以添加<your-project>/src/test/resources/application.properties
(或application.yaml
(
h2.datasource.url=jdbc:h2:mem:somedatebase;DB_CLOSE_DELAY=-1
h2.datasource.username=sa
h2.datasource.password=
然后您需要@Autowired
您的UserRepository
。这样做之后,我可以成功运行您的示例测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {
@Autowired
private UserRepository userRepository;
@Test
public void functionTest(){
User user = new User();
user.setUsername("username");
userRepository.save(user);
List<User> users = functionIwantToTest();
assertThat(users.size(), is(1));
}
public List<User> functionIwantToTest(){
return userRepository.findAll();
}
}
模拟对象是界面或类定义某些方法调用输出的类的虚拟对象。
您需要定义规则,例如:
Mockito.when(userRepository.findAll()).thenReturn(Collections.singletonList(user));