如何模拟存储库中的持久数据,直到用Spring引导完成测试



要实现我们的测试,我需要从存储库中检索保存的数据。由于存储库只是一个模拟的存储库,所以我找不到这些数据。

这是我写的代码:

@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));

相关内容

  • 没有找到相关文章

最新更新