Spring Boot Controller Test: проверка сервиса, требующего нижестоящих объектов, вызывающих ApplicationContext не загружается - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь запустить модульный тест Spring Boot на уровне контроллера с Mock для моей зависимости уровня обслуживания.Однако для этого Mock требуется зависимость от репозитория в нисходящем направлении, которая использует объект EntityManager, что приводит к сбою моего теста при загрузке ApplicationContext.

Мой тест не включает зависимость от репозитория или EntityManager, он использует объект службы Mocked для возврата готового ответа.Почему Spring жалуется на репо / EntityManager, если я хочу только смоделировать объект уровня сервиса?

Тестовый код модуля контроллера:

@RunWith(SpringRunner.class)
@WebMvcTest
@AutoConfigureWebClient
public class MobileWearControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    UserDeviceService userDeviceService;

    //.....
}

Код UserDeviceService:

@Service
public class UserDeviceService {

    private UserDeviceRepository userDeviceRepository;

    public UserDeviceService(UserDeviceRepository userDeviceRepository) {
        this.userDeviceRepository = userDeviceRepository;
    }

    //....
}

Код UserDeviceRepository:

@Repository
public class UserDeviceRepositoryImpl implements UserDeviceRepositoryCustom {

    @PersistenceContext
    private EntityManager em;

    //....
}

Ожидается выполнение теста.

Фактический результат - получение следующей трассировки стека:

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDeviceRepositoryImpl': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available
...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available
...

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Моей проблемой были аннотации, которые я использовал для своего теста.

Использование @AutoConfigureWebClient пытается остановить весь Spring Context;Так как я тестирую свой контроллер, я хочу протестировать только веб-слой и смоделировать нисходящие зависимости (т.е. UserDeviceService).Так что вместо этого я должен использовать @SpringBootTest и @AutoConfigureMockMvc, что установит мой Spring-контекст только для уровня контроллера.

Используя этот подход, я могу заставить UserDeviceService успешно выполнять макет и, таким образом, разрешить мой тестскомпилировать и запустить:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MobileWearControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    UserDeviceService userDeviceService;

    //...
}
0 голосов
/ 17 апреля 2019

Во-первых, вам нужно указать, какие контроллеры вы собираетесь тестировать

@WebMvcTest(YourController.class)

Кроме того, с JUnit5 вам не нужно настраивать какие-либо расширения, как @WebMvcTestсодержит @ExtendWith(SpringExtension.class).Вы, очевидно, на JUnit4, но это не должно причинить никакого вреда.

Проверьте, например, https://spring.io/guides/gs/testing-web/

...