Переопределение Autwired Bean в модульных тестах
Есть ли простой способ, которым я могу легко переопределить bean-компонент в определенных модульных тестах? В классах компиляции есть только один bean-компонент каждого типа, так что в этом случае это не проблема для автоматического подключения. Тестовые классы будут содержать дополнительные макеты. При запуске модульного теста я просто хотел бы указать дополнительную конфигурацию, которая говорит в основном, а при выполнении этого модульного теста используйте этот макет вместо стандартного компонента.
Профили кажутся немного излишними для того, что мне нужно, и я не уверен, что это было бы достижимо с помощью основной аннотации, поскольку разные юнит-тесты могут иметь разные макеты
Ответы
Ответ 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
Ответ 4
Вы должны использовать профили spring, чтобы узнать, какой тип bean вы хотите использовать в разных контекстах.
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html
Ответ 5
возможно, это может быть полезно для вас:
https://github.com/kmoens/springockito
Ответ 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"
, по-видимому, это нужно.