DataJpaTest с одним протестированным бином - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы создать тест, который нацелен только на один класс обслуживания (@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.Если какой-то ответ предполагает это, то он должен объяснить, почему это лучший путь.

...