Я хотел бы создать тест, который нацелен только на один класс обслуживания (@Service
) в моем проекте.
Мой класс обслуживания имеет два вида зависимостей:
- другие службы, которые я хочу смоделировать с помощью
@MockBean
- JPA-репозиториев, которых у меня нетхочу издеваться;Я хочу, чтобы они были реальными компонентами Spring, настроенными для базы данных H2
Мои сервисы зависят только от других сервисов или репозиториев.Репозитории не имеют зависимостей - представьте себе интерфейсы репозитория 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);
}
}
У меня вопрос, есть ли альтернатива этому решению,который не требует ручной сборки тестируемого боба.Решение, которое позволило бы Spring собрать для меня bean-компонент, используя mocked-сервисы и реальные (H2) репозитории.Решение, позволяющее тестируемому компоненту иметь зависимости @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
.Если какой-то ответ предполагает это, то он должен объяснить, почему это лучший путь.