@Autowired внутри SpringRunner SpringBootTest Unit Test Cases

Наш 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

person Bernie Lenz    schedule 29.08.2017    source источник
comment
Вы нашли решение?   -  person Pawan    schedule 11.11.2017
comment
Нет, к сожалению нет   -  person Bernie Lenz    schedule 12.11.2017
comment
Эта ошибка возникла, когда я переключился со среды на основе Eclipse + Maven на Intelij + Gradle. Мои ошибки исчезли после перезапуска IDE и перестроения.   -  person Pawan    schedule 12.11.2017


Ответы (1)


Позвольте мне поговорить с точки зрения класса TransferTest.java.

Этот класс тестирует класс AccountUtilsTest. Поэтому просто предоставьте зависимость класса AccountUtilTest для TransferTest.Mock для каждой зависимости, которая автоматически подключается и используется в AcccountUtilsTest.

eg:

package com.company;

@RunWith(SpringRunner.class)
public class TransferTest {

    @Mock
    IService1 someService1Mock;

    @Mock
    IService2 someService2Mock


    @InjectMocks
    private AccountTestUtils accountTestUtils;

    @Test
    public void basicTransferTestExpectSuccess() {
       accountTestUtils.createAccount();
       ...
    }
}
person Shamil Puthukkot    schedule 15.01.2020