DataJpaTest与单个自动连线的测试bean

时间:2019-02-20 22:00:30

标签: java spring spring-boot spring-data-jpa spring-test

我想创建一个测试,该测试恰好针对我项目中的一个服务类(@Service)。

我的服务类具有两种依赖关系:

  • 其他服务,我想用@MockBean
  • 来模拟
  • JPA存储库,我不想嘲笑;我希望它们是针对H2数据库配置的真正的Spring Bean

我的服务仅依赖于其他服务或存储库。存储库没有依赖性-想象一下JPA存储库接口。

我想出了以下解决方案,效果很好:

@DataJpaTest
class FooServiceTests {

    @Autowired
    private FooRepository fooRepository;

    @MockBean
    private BarService barService;

    @Test
    void testService() {
        FooService fooService = new FooService(barService, fooRepository);
        Assertions.assertNotNull(barService);
        Assertions.assertNotNull(fooRepository);
    }

}

我的问题是,该解决方案是否有替代方案,它不需要手动组装被测试的bean。一个解决方案是让Spring使用模拟服务和真实(H2)存储库为我组装bean。一种解决方案,允许经过测试的bean将@Autowired依赖项放入私有字段中。像这样的东西:(显然不起作用):

@DataJpaTest
@ContextConfiguration(classes = FooService.class)
class FooService2Tests {

    @MockBean
    private BarService barService;

    @Autowired
    private FooService fooService;

    @Test
    void testService() {
        Assertions.assertNotNull(fooService);
        Assertions.assertNotNull(barService);
        Assertions.assertNotNull(fooService.getBarService());
        Assertions.assertNotNull(fooService.getFooRepository());
    }

}

我想避免使用@SpringBootTest。如果有答案的话,那么就应该解释,为什么这是最好的选择。

0 个答案:

没有答案