Существует документ http://static.springsource.org/spring/docs/2.5.6/reference/testing.html, как добавить поддержку МОК тестам junit с помощью конфигурации XML, но я не могу найти пример для основанной на Java конфигурации...
Например, у меня есть основанный на Java боб:
public class AppConfig
{
@Bean
public Test getTest() { return new Test(); }
}
И тест:
@RunWith(SpringJUnit4ClassRunner.class)
public class IocTest
{
@Autowired
private Test test;
@Test
public void testIoc()
{
Assert.assertNotNull(test);
}
}
Что я должен добавить для включения основанных на Java бобов к моему тесту junit, не используя xml-конфигурации?
Обычно я использую:
new AnnotationConfigApplicationContext(AppConfig.class);
но это не работает на тесты...
Обновление: Spring 3.1 будет поддерживать его прямо из коробки, см. Spring 3.1 M2: Тестирование с использованием классов и профилей @Configuration .
Похоже, эта функция не поддерживается к весне еще нет. Однако это легко реализовать:
public class AnnotationConfigContextLoader implements ContextLoader {
public ApplicationContext loadContext(String... locations) throws Exception {
Class<?>[] configClasses = new Class<?>[locations.length];
for (int i = 0; i < locations.length; i++) {
configClasses[i] = Class.forName(locations[i]);
}
return new AnnotationConfigApplicationContext(configClasses);
}
public String[] processLocations(Class<?> c, String... locations) {
return locations;
}
}
-
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class,
value = "com.sample.AppConfig")
public class IocTest {
@Autowired
TestSerivce service;
@Test
public void testIoc()
{
Assert.assertNotNull(service.getPredicate());
}
}
-
@Configuration
public class ApplicationConfig
{
...
@Bean
public NotExistsPredicate getNotExistsPredicate()
{
return new NotExistsPredicate();
}
@Bean
public TestService getTestService() {
return new TestService();
}
}
Если вы получаете нулевое значение, вероятно, это не загрузка контекста приложения.
Обратите внимание, что по умолчанию бегун загружает его из "classpath: /com/test/IocTest-context.xml" (при условии, что пакет IocTest.java является com.test)
Если его нет, попробуйте указать его добавив
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "PATH_TO_YOUR_APP_CONTEXT/yourApplicationContext.xml" })
public class IocTest
{
@Autowired
private Test test;
@Test
public void testIoc()
{
Assert.notNull("test is null", test);
}
}
В общем, почему это не работает (утверждение не выполняется):
public class IocTest
{
@BeforeClass
public static void initSpringIoc()
{
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);
NotExistsPredicate predicate = ctx.getBean(NotExistsPredicate.class);
LoggerFactory.getLogger(IocTest.class).debug(predicate.toString());
}
@Test
public void testIoc()
{
TestService service = new TestService();
Assert.assertNotNull(service.getPredicate()); // assert fails
}
}
public class TestService
{
@Autowired
private NotExistsPredicate predicate;
public NotExistsPredicate getPredicate()
{
return predicate;
}
}
Вывод журнала:
1 [main] INFO org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@e94e92: startup date [Tue Feb 09 15:32:48 EET 2010]; root of context hierarchy
2 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Bean factory for org.springframework.context.annotation.AnnotationConfigApplicationContext@e94e92: org.springframework.beans.factory.support.DefaultListableBeanFactory@a37368: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,applicationConfig]; root of factory hierarchy
33 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
33 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
84 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor' to allow for resolving potential circular references
87 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
129 [main] DEBUG org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader - Registering bean definition for @Bean method com.mihailenco.config.ApplicationConfig.getNotExistsPredicate()
133 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
133 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
135 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor' to allow for resolving potential circular references
135 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
135 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
135 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
136 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor' to allow for resolving potential circular references
137 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
142 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
142 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
151 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor' to allow for resolving potential circular references
151 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
155 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@86fe26]
164 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@139eeda]
166 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@a37368: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,applicationConfig,getNotExistsPredicate]; root of factory hierarchy
166 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
166 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
166 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.annotation.internalRequiredAnnotationProcessor'
171 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
171 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'applicationConfig'
172 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'applicationConfig'
174 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'applicationConfig' to allow for resolving potential circular references
190 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'applicationConfig'
190 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'getNotExistsPredicate'
190 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'getNotExistsPredicate'
196 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'applicationConfig'
225 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'getNotExistsPredicate' to allow for resolving potential circular references
232 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'getNotExistsPredicate'
235 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@134a7d8]
235 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor'
237 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'getNotExistsPredicate'
253 [main] DEBUG IocTest - com.mihailenco.predicate.NotExistsPredicate@982589