Наш Spring Boot REST API в настоящее время имеет довольно большой репозиторий модульных тестов. Модульные тесты реорганизуют общий многоразовый тестовый код в TestUtil
классов, которые @Component
аннотируются.
Похоже, что модульные тесты SpringRunner
могут найти классы @Autowired TestUtil
только в том случае, если они импортированы как часть параметра класса аннотации @SpringBootTest
.
Кроме того, все переменные @Autowired
внутри классов TestUtil
также необходимо импортировать в параметр классов аннотации @SpringBootTest
.
Поскольку у нас есть около 30 классов модульных тестов, и каждый класс должен импортировать примерно 40 других классов в аннотации @SpringBootTest
, можно представить, насколько это стало неудобным в сопровождении.
Если класс не импортирован как часть параметра @SpringBootTest
классов, выдается следующая ошибка
org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean-компонента с именем «com.company.FeeTest»: неудовлетворенная зависимость, выраженная через поле «accountTestUtils»; вложенным исключением является org.springframework.beans.factory.NoSuchBeanDefinitionException: нет подходящего bean-компонента типа «com.company.accountTestUtils»: ожидается как минимум 1 bean-компонент, который квалифицируется как кандидат на автоматическое подключение. Аннотации зависимостей: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Кто-нибудь знает лучший способ использовать аннотацию @Autowired
внутри тестовых случаев без необходимости явно импортировать их внутри аннотации @SpringBootTest
?
Пример кода ниже
FeeTest.java
package com.company;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
AccountTestUtils.class,
... need to list any @Autowired component in AccountTestUtils
})
public class FeeTest {
@Autowired
private AccountTestUtils accountTestUtils;
@Test
public void basicFeeTestExpectSuccess() {
accountTestUtils.createAccount();
...
}
}
TransferTest.java
package com.company;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {
AccountTestUtils.class,
... need to list any @Autowired component in AccountTestUtils
})
public class TransferTest {
@Autowired
private AccountTestUtils accountTestUtils;
@Test
public void basicTransferTestExpectSuccess() {
accountTestUtils.createAccount();
...
}
}
AccountTestUtils.java
package com.company;
@Component
public class AccountTestUtils {
@Autowired
private IService1 someService1;
@Autowired
private IService2 someService2;
@Autowired
private SomeRepository someRepository1;
public void createAccount() {
someService1.doSomething();
someService2.doSomething();
someRepository2.doSomething();
}
}
Наша структура пакета — это обычная структура maven.
/src
/main
/java
/resources
/test
/java
/resources