【问题标题】:How do I retrieve an object from a database in spring boot for testing?如何在 Spring Boot 中从数据库中检索对象进行测试?
【发布时间】:2021-03-15 10:01:11
【问题描述】:

我对单元测试或集成测试不是很有经验。我有以下场景:我只是想从我的数据库中获取一个对象以用于测试。对象不会更新,只是懒得手动创建,因为类比较长,比较麻烦。

我从数据库中获取内容的结构是一个调用存储库接口的服务类。现在我的问题是运行测试时存储库为空。

使用 @DataJpaTest@AutoConfigureTestDatabase(replace = Replace.NONE) 我可以连接到我的数据库,但是服务类中的存储库为空。

我尝试模拟存储库接口并将其注入服务类,但随后我返回的对象为 null,这显然违背了目的。

如果您还可以链接我一些教程,我会很高兴,因为我找不到与我的案例相关的任何教程。所有其他解释都描述了如何自己测试查询,这是我不想要的。我只需要一个对象。

如果我遗漏了一些明显的东西,我深表歉意,我在测试方面真的缺乏经验。

这就是我所拥有的:

我的服务:

@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
    }
}

【问题讨论】:

  • 这是单元测试还是集成测试?特定测试的目的是什么?
  • @tgdavies 据我了解,我会说单元测试。我有一个对应于数据库表和 DTO 的对象。为了确定原始对象和DTO之间的映射是否正确,我想从数据库中获取一个对象,将它映射到我的DTO,然后断言各种东西。

标签: java spring database unit-testing integration-testing


【解决方案1】:

在进行单元测试时,One 根本不需要处理真实数据。通过给你一种从数据库中读取的方法来回答这个问题将完全没有抓住重点。如果只是简单地测试一个对象是否存在,它是否具有特定的属性,那么对象来自哪里又有什么关系呢?可以创建一个类似于数据库中的测试对象,或者简单地使用 Mockito 框架中的 Mocks。在应该从数据库中检索真实对象的步骤中,可以简单地返回 Mock 对象。

话虽如此,如果您仍然想使用 DB,这里有一个使用 java 从 DB 读取数据的教程。

CRUD 应用教程 - https://www.callicoder.com/spring-boot-jpa-hibernate-postgresql-restful-crud-api-example/

这是一个使用模拟的工具 - https://www.baeldung.com/mockito-series

【讨论】:

  • 谢谢!我明白了,所以从数据库中获取数据进行单元测试违背了单元测试的重点?
  • @mackesmilian 单元测试旨在测试在该特定类/函数本身中编写的逻辑 - 仅此而已。除非该函数旨在创建对象,否则从数据库中检索对象与单元测试的想法是对立的。如果您想测试整个系统,就好像它是真实的一样,集成测试是一种不同类型的端到端测试,用于确保新更改不会破坏任何核心、更广泛的功能。
【解决方案2】:

你知道@DataJpaTest @AutoConfigureTestDatabase(replace = Replace.NONE) 这将配置您的内存数据库?

为了连接到 db,您需要使用测试资源中的 db 访问属性启动 spring 上下文,例如使用注释 @SpringBootTest。如果您想使用该类,也不要模拟 jparepository(否则它将返回 null 或模拟响应)。使用 @SpringBootTest 时,您想要 @Autowire 服务。如果你需要模拟一些服务,你只需要用 @MockBean 注释它

【讨论】:

    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 2016-06-12
    • 2015-07-24
    • 2017-07-11
    • 2021-01-24
    • 1970-01-01
    • 2021-12-17
    • 2016-07-09
    相关资源
    最近更新 更多