java—如何在SpringBoot中从数据库检索对象以进行测试?

vsdwdz23  于 2021-07-22  发布在  Java
关注(0)|答案(2)|浏览(352)

我对单元或集成测试不是很有经验。我有以下场景:我只想从我的数据库中获取一个用于测试的对象。对象不会被更新,我只是懒得手动创建它,因为它是一个相当长的类,而且会非常麻烦。
我从数据库中获取信息的结构是一个调用存储库接口的服务类。现在我的问题是运行测试时存储库为空。
使用 @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
    }
}
5lhxktic

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

t0ybt7op

t0ybt7op2#

您知道@datajpatest@autoconfiguretestdatabase(replace=replace.none)这将配置内存中的数据库吗?
为了连接到db,您需要在测试资源中使用db access属性启动spring上下文,例如使用annotation@springboottest。如果您想使用这个类,也不要模拟jparepository(否则它将返回null或模拟响应)。使用@springboottest时,您需要@autowire服务。如果您需要模拟某个服务,只需使用@mockbean对其进行注解

相关问题