#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;
}
Если у вас мало зависимостей, вы можете использовать этот способ, но я не нашел решения для включения инициализации пакета.