我对单元或集成测试不是很有经验。我有以下场景:我只想从我的数据库中获取一个用于测试的对象。对象不会被更新,我只是懒得手动创建它,因为它是一个相当长的类,而且会非常麻烦。
我从数据库中获取信息的结构是一个调用存储库接口的服务类。现在我的问题是运行测试时存储库为空。
使用 @DataJpaTest
以及 @AutoConfigureTestDatabase(replace = Replace.NONE)
我可以让数据库的连接正常工作,但是服务类中的存储库为空。
我尝试模拟存储库接口并将其注入到服务类中,但是我得到的对象是空的,这显然违背了目的。
我很高兴如果你也能给我链接一些教程,因为我找不到任何与我的案例相关的。所有其他的解释都描述了如何测试查询本身,这是我不想要的。我只需要一个东西。
我很抱歉,如果我错过了一些明显的东西,我真的没有经验,当谈到测试。
这就是我所拥有的:
我的服务:
@Service
@Transactional(readOnly = true)
public class MyService{
@Autowired
private MyRepository repo;
public List<MyObj> findAll() {
return repo.findAll();
}
public MyObj findMyObjByCode(String code) {
return repo.findMyObjByCode(code);
}
}
测试:
@ActiveProfiles("test")
@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
class MyObjTest{
@Test
void factoryTest() {
MyService service = new MyService ();
MyObj obj = service.findMyObjByCode("code");
MyDto dto = MyDto.from(obj);
//assertions
}
}
2条答案
按热度按时间5lhxktic1#
当进行单元测试时,根本不需要处理真实的数据。如果回答这个问题,给你一个从数据库中阅读的方法,那就完全没有抓住重点。如果一个人只是测试一个对象是否存在,它是否拥有特定的属性,那么这个对象来自哪里又有什么关系呢?可以创建一个与db中的测试对象相似的测试对象,或者只使用mockito框架中的mock。在应该从db中检索真实对象的步骤中,可以简单地返回mock对象。
话虽如此,如果您仍然想使用数据库,这里有一个从java数据库读取数据的教程。
crud应用程序教程-https://www.callicoder.com/spring-boot-jpa-hibernate-postgresql-restful-crud-api-example/
这里有一个可以和mocks一起工作的-https://www.baeldung.com/mockito-series
t0ybt7op2#
您知道@datajpatest@autoconfiguretestdatabase(replace=replace.none)这将配置内存中的数据库吗?
为了连接到db,您需要在测试资源中使用db access属性启动spring上下文,例如使用annotation@springboottest。如果您想使用这个类,也不要模拟jparepository(否则它将返回null或模拟响应)。使用@springboottest时,您需要@autowire服务。如果您需要模拟某个服务,只需使用@mockbean对其进行注解