为了账号安全,请及时绑定邮箱和手机立即绑定

我们应该在 Spring Boot 中为存储库层编写单元测试和集成测试吗?

我们应该在 Spring Boot 中为存储库层编写单元测试和集成测试吗?

慕尼黑5688855 2022-07-27 11:31:41
我有很多关于Spring Boot存储库层的问题。我的问题是:Spring Boot我们是否应该为没有任何自定义代码或查询的存储库层编写单元测试和集成测试?为存储库层编写集成测试的最佳方法是Spring Boot什么?我列出了以下两种方法。在这两种方法中,哪一种更好。是否有任何最佳实践我应该遵循另一个?如果我的上述问题#1 的答案是肯定的,那么我如何为存储库层编写单元测试Spring Boot?CurrencyRepository.java@Repositorypublic interface CurrencyRepository extends CrudRepository<Currency, String> {}由于这使用嵌入式 H2 DB,因此它是集成测试而不是单元测试。我的理解正确吗?CurrencyRepositoryIntegrationTest.java(方法 1)@RunWith(SpringRunner.class)@DataJpaTestpublic class CurrencyRepositoryIntegrationTest {    @Autowired    private TestEntityManager entityManager;    @Autowired    private CurrencyRepository repository;    @Test    public void testFindByName() {        entityManager.persist(new Currency("USD", "United States Dollar", 2L));        Optional<Currency> c = repository.findById("USD");        assertEquals("United States Dollar", c.get().getCcyNm());    }}CurrencyRepositoryIntegrationTest2.java(方法 2)@RunWith(SpringRunner.class)@SpringBootTest(classes = DemoApplication.class)public class CurrencyRepositoryIntegrationTest2 {    @Autowired    private CurrencyRepository repository;    @Test    public void testFindByName() {        repository.save(new Currency("USD", "United States Dollar", 2L));        Optional<Currency> c = repository.findById("USD");        assertEquals("United States Dollar", c.get().getCcyNm());    }}
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

对于集成测试,有句老话“不要嘲笑你不拥有的东西”。参见例如https://markhneedham.com/blog/2009/12/13/tdd-only-mock-types-you-own/https://8thlight.com/blog/eric-smith/2011/10/27 /thats-not-yours.html

您将编写的 JUnit 测试将模拟底层 EntityManger 以测试 spring 是否正确实现。这是我们希望 Spring 开发人员已经拥有的测试,所以我不会重复它。

对于集成测试,我猜您并不关心存储库如何或是否在下面使用 EntityManager。你只是想看看它的行为是否正确。所以第二种方法更适合。


查看完整回答
反对 回复 2022-07-27
  • 1 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信