我想创建一个测试,该测试恰好针对我项目中的一个服务类(@Service
)。
我的服务类具有两种依赖关系:
@MockBean
我的服务仅依赖于其他服务或存储库。存储库没有依赖性-想象一下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
。如果有答案的话,那么就应该解释,为什么这是最好的选择。