Тестирование пружинного загрузочного контроллера, у которого есть зависимости?(JUnit) - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть этот тестовый класс:

@RunWith(SpringRunner.class)
@WebMvcTest(ClassToBeTested.class)
public class ClassToBeTestedTests {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void simpleTestMethodToGetClassWorking(){
        Assert.assertTrue(true);
    }
}

но в классе, который я хочу проверить, у меня есть эта строка:

@Autowired
AnnoyingServiceWhichIsADependency annoyingDependency;

Поэтому, когда я пытаюсь запустить тестовый класс - я получаю эту ошибку:

java.lang.IllegalStateException: Failed to load ApplicationContext

и причина за строкой, кажется, подбрасывает это:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ClassToBeTested': Unsatisfied dependency expressed through field 'AnnoyingServiceWhichIsADependency'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type '<package-path>.AnnoyingServiceWhichIsADependency' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Я добавлю, что реальный класс работает и выполняет то, для чего он предназначен, но у меня возникают проблемы с его работой в мире модульных тестов.

Вся помощь приветствуется.

Ответы [ 4 ]

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

Причина, по которой компонент не создан для класса зависимостей, заключается в том, что вы используете @WebMvcTest, а не @SpringBootTest: сканируются только контроллеры и классы инфраструктуры MVC.Из документов :

Может использоваться, когда тест фокусируется только на компонентах Spring MVC.

Поскольку это тест MVC, вы можете макетироватьсервисная зависимость.Пример: https://reflectoring.io/spring-boot-web-controller-test/

0 голосов
/ 29 апреля 2019

Просто смейся над этой зависимостью.Предполагая, что AnnoyingServiceWhichIsADependency является интерфейсом:

@RunWith(SpringRunner.class)
@WebMvcTest(ClassToBeTested.class)
public class ClassToBeTestedTests {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private AnnoyingServiceWhichIsADependency annoyingDependency;

    @Test
    public void simpleTestMethodToGetClassWorking(){
        Assert.assertTrue(true);
    }
}

Используйте методы Mockito when и thenReturn для инструктирования макета.

0 голосов
/ 29 апреля 2019

@ WebMvcTest только собирается сканировать веб-слой - инфраструктуру MVC и классы @Controller. Вот и все. Так что, если ваш контроллер имеет некоторую зависимость от других bean-компонентов, например, сформируйте свой сервисный уровень, они не будут найдены для внедрения.

Если вы хотите более комплексный интеграционный тест, используйте @SpringBootTest вместо @ WebMvcTest

Если вы хотите что-то ближе к модульному тесту, смейтесь над своей зависимостью.

Также обратите внимание, что полевая инъекция (@Autowired непосредственно на поле) не рекомендуется именно по этим причинам. Я рекомендую вам перейти на конструктор injeciton (добавьте конструктор для Classtobetested и поместите на него аннотацию @Autowired.) Затем для модульного теста вы можете пройти макет. Внедрение в конструктор приводит к более тестируемой и настраиваемой конструкции.

0 голосов
/ 29 апреля 2019

Контекст вашего тестового приложения пытается загрузить ваш ClassToBeTested, но не может найти одну из его зависимостей и жалуется на это из-за этой ошибки. По сути, вам нужно иметь @Bean этого типа в тестовом контексте. Можно будет создать класс TestConfig, который предоставляет Mock / Spy этой зависимости с помощью аннотации @Bean. В вашем тесте вам нужно будет загрузить внутри контекста через аннотацию @ContextConfiguration эту конфигурацию теста, которую вы только что создали.

https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#spring-testing-annotation-contextconfiguration

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...