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

#java #spring #spring-boot #spring-test #spring-test-mvc

#java #весна #spring-boot #spring-тест #spring-test-mvc

Вопрос:

У меня есть два класса

 @Service
public class A {

}

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

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

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

Комментарии:

1. Мнение: существует небольшая добавленная стоимость в тестировании нескольких, но не всех компонентов вашего приложения одновременно. Выполните обширное модульное тестирование, а затем протестируйте свои бизнес-требования на полном стеке приложений.

Ответ №1:

Я знаю только, как это сделать с помощью 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();
        }
    }
}
 

Ответ №2:

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

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

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

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

Ответ №3:

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

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

    @Autowired
    private B b;
}
 

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