Подтвердить что ты не робот

Переопределение Autwired Bean в модульных тестах

Есть ли простой способ, которым я могу легко переопределить bean-компонент в определенных модульных тестах? В классах компиляции есть только один bean-компонент каждого типа, так что в этом случае это не проблема для автоматического подключения. Тестовые классы будут содержать дополнительные макеты. При запуске модульного теста я просто хотел бы указать дополнительную конфигурацию, которая говорит в основном, а при выполнении этого модульного теста используйте этот макет вместо стандартного компонента.

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

4b9b3361

Ответ 1

Если вы просто хотите предоставить другой bean в своих тестах, я думаю, вам не нужно использовать профили spring или mockito.

Просто выполните следующие действия:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { TestConfig.class })
public class MyTest
{
    @Configuration
    @Import(Application.class) // the actual configuration
    public static class TestConfig
    {
        @Bean
        public IMyService myService()
        {
            return new MockedMyService();
        }
    }

    @Test
    public void test()
    {
        ....
    }
}

ПРИМЕЧАНИЕ: проверено с помощью spring boot 1.3.2/spring 4.2.4

Ответ 2

В Spring Boot 1.4 есть простой способ для этого:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { MyApplication.class })
public class MyTests {
    @MockBean
    private MyBeanClass myTestBean;

    @Before
    public void setup() {
         ...
         when(myTestBean.doSomething()).thenReturn(someResult);
    }

    @Test
    public void test() {
         // MyBeanClass bean is replaced with myTestBean in the ApplicationContext here
    }
}

Ответ 3

У меня была аналогичная проблема, и я решил с микс, и я нахожу это еще более полезным и многоразовым. Я создал профиль spring для тестов и класс конфигурации, который переопределяет beans, я хочу высмеять очень простым способом:

@Profile("test")
@Configuration
@Import(ApplicationConfiguration.class)
public class ConfigurationTests {

    @MockBean
    private Producer kafkaProducer;

    @MockBean
    private SlackNotifier slackNotifier;

}

Сделав это, я могу @Autowire эти макет beans и использовать mockito для проверки на них. Главное преимущество заключается в том, что теперь все тесты легко получают макет beans без каких-либо изменений в каждом тестировании. Протестировано с помощью:

spring boot 1.4.2

Ответ 6

Как прокомментировал @ContextConfiguration для этого полезно @ContextConfiguration.

Скажем, родительский тестовый класс выглядит так:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring/some-dao-stuff.xml"
    ,"classpath:spring/some-rest-stuff.xml"
    ,"classpath:spring/some-common-stuff.xml"
    ,"classpath:spring/some-aop-stuff.xml"
    ,"classpath:spring/some-logging-stuff.xml"
    ,"classpath:spring/some-services-etc.xml"
})
public class MyCompaniesBigTestSpringConfig {
...

Создайте дочерний тестовый класс:

package x.y.z;
@ContextConfiguration
public class MyOneOffTest extends MyCompaniesBigTestSpringConfig {
...

и поместите в src/test/resources/x/y/z/MyOneOffTest -context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <bean id="widgetsService" class="com.mycompany.mydept.myservice.WidgetsService" primary="true" />

</beans>

Этот widgetsService компонент widgetsService будет переопределять (widgetsService) bean-компонент, определенный в основной конфигурации xml (или в конфигурации Java). См. AboutititLocations. Также обратите внимание на файл -context.xml по умолчанию. Пример этого здесь. Обновление: мне пришлось добавить primary="true", по-видимому, это нужно.