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

у меня два класса

@Service
public class A {

}

@Service
public class B {
    @Autowired
    private A a;
}

Я хотел бы написать интеграционный тест, который проверит мой класс B. Я не хочу загружать все приложение Spring Boot, поэтому аннотация @SpringBootTest для меня не работает. Я пытался использовать аннотацию @WebMvcTest, но она загружает и другие классы.

Есть ли способ загрузить только определенные классы или пакеты?


person Gevorg Harutyunyan    schedule 21.01.2021    source источник
comment
Мнение: Тестирование нескольких, но не всех компонентов вашего приложения одновременно дает мало пользы. Выполните всестороннее модульное тестирование, а затем протестируйте свои бизнес-требования на полном стеке приложений.   -  person chrylis -cautiouslyoptimistic-    schedule 21.01.2021


Ответы (3)


Я знаю только, как это сделать с помощью TestNG. Ваш тестовый класс должен расширять AbstractTestNGSpringContextTests. Теперь вы также можете добавить Bean и конфигурации, чтобы вы могли издеваться над своими объектами @Autowired, при необходимости это должно быть что-то похожее на то, что показано ниже.

Пример:

@ContextConfiguration(classes = {MyTest.TestConfig.class})
class MyTest extends AbstractTestNGSpringContextTests {
    private A mockA = mock(A.class);

    @Autowired
    private B b;

    @Configuration
    static class TestConfig {
        @Bean
        public A a() {
            return mockA;
        }

        @Bean
        public B b() {
            return new B();
        }
    }
}
person Petre Popescu    schedule 21.01.2021

Моделирование зависимостей, которые не входят в объем данного типа теста (например, модульного теста):

@RunWith(MockitoJUnitRunner.class)
public class BTest {
    @Mock
    private A aMock;

    @InjectMocks
    private B bService;
    
    @Test
    public void testStuff() { ... }
}

В приведенном выше тесте я издевался над сервисом A с помощью @Mock, который является зависимостью от сервиса B. Затем макет вводится в B через @InjectMocks. Затем вы можете тестировать методы из B, имитируя методы из A.

person Branislav Lazic    schedule 21.01.2021

Я нашел ответ частично.

@SpringBootTest(classes = {A.class, B.class})
public class BTest {

    @Autowired
    private B b;
}

Если у вас мало зависимостей, вы можете использовать этот способ, но я не нашел решения для включения инициализации для package.

person Gevorg Harutyunyan    schedule 21.01.2021