【问题标题】:Add Spring 3.0.0 java based IOC to JUnit 4.7 tests将 Spring 3.0.0 基于 java 的 IOC 添加到 JUnit 4.7 测试
【发布时间】:2010-02-09 11:59:49
【问题描述】:

有一个文档http://static.springsource.org/spring/docs/2.5.6/reference/testing.html how to add IoC support to junit testing using xml-configuration,但我找不到基于 java 的配置示例...

例如,我有基于 java 的 bean:

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);
    }
}

在不使用 xml-configs 的情况下,我应该添加什么以在我的 junit 测试中启用基于 java 的 bean?

我通常使用:

new AnnotationConfigApplicationContext(AppConfig.class);

但它不适用于测试...

【问题讨论】:

    标签: java spring junit


    【解决方案1】:

    更新:Spring 3.1 将立即支持它,请参阅Spring 3.1 M2: Testing with @Configuration Classes and Profiles


    Spring 似乎还不支持此功能。 但是,它很容易实现:

    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();
        }
    }
    

    【讨论】:

    • 谢谢,但仍然无法正常工作...我的测试类:pastebin.com/m4125a931,ApplicationConfig:pastebin.com/m2842d2a1,TestService:pastebin.com/m1ac16e48。然后我单击 NetBeans“测试文件”并获得断言失败 (assertNotNull) 和此日志:pastebin.com/mad10742。能给点建议吗?
    • @Vladimir:您不能简单地使用 new 创建自动装配对象。它应该从上下文中获得。我添加了一个示例,说明如何使用 @Bean-annotated 注释配置上下文的方法创建 TestService
    【解决方案2】:

    如果你得到一个空值,可能它没有加载应用程序上下文。

    请注意,默认情况下,运行程序会从“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);
        }
    }
    

    【讨论】:

    • 我想在没有任何 xml 配置的情况下使用基于 java 的配置来配置 ApplicationContext。有一个有问题的示例(AppConfig 类)。
    【解决方案3】:

    通常,为什么这不起作用(断言失败):

    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
    

    【讨论】:

    • 这不起作用,因为您实例化了它。但这不应该是一个答案 - 它应该是对您的问题的编辑
    【解决方案4】:

    这对我有用...

    取自http://www.swiftmind.com/de/2011/06/22/spring-3-1-m2-testing-with-configuration-classes-and-profiles/

    package com.example;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    // ApplicationContext will be loaded from the
    // OrderServiceConfig class
    @ContextConfiguration(classes=OrderServiceConfig.class,
        loader=AnnotationConfigContextLoader.class)
    public class OrderServiceTest {
    
        @Autowired
        private OrderService orderService;
    
        @Test
        public void testOrderService() {
            // test the orderService
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2013-11-04
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多