close

  早先有兩篇Blog:JUnit的Parameteried在Spring的測試Spring3的@Component與@Configuration湊在一起,有個問題產生了,就是JUnit4如何對Annotation Context(即AnnotationConfigApplicationContext)進行單元測試?而Spring 3.0.1還沒支援到此,卻有國外網友寫出解決方式了,http://stackoverflow.com/questions/2228820/add-spring-3-0-0-java-based-ioc-to-junit-4-7-tests

  1. 先寫實作org.springframework.test.context.ContextLoader介面的Class,為什麼test要加粗,是因為Spring好像不只一個名為ContextLoader的類別或介面,而這Class本來就要用在Test。

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

  2. 再寫有@Configuration的Class

    @Configuration
    public class MgrConfig {
        private static Logger logger = LoggerFactory.getLogger(MgrConfig.class);
        @Bean(name="foo1")
        public IFooMgr iFooMgr() {
            logger.info("call IFooMgr");
            return new FooMgrImpl();
        }
    }

  3. 最後用JUnit來測試。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(loader = AnnotationConfigContextLoader.class,
            value = "com.foo.MgrConfig")
    public class TestDaoConfig {
        private static Logger logger = LoggerFactory.getLogger(TestDaoConfig.class);
        @Autowired
        private IFooMgr fooMgr;
        @Test
        public void testDao() {
            System.out.println(fooMgr.tellMe("Foo"));
            logger.info(fooMgr.tellMe("Foo"));
        }
    }

  上述的load是對到程式一,實作ContextLoader的Class,而value對到程式二,@Configuration class。雖是完全Zero-Configuration,可是尚且不足的是,沒有好好利用Spring3 @Configuration特有的lazy-initialization的功能,所以啟動時,MgrConfig的iFooMgr先被call一次,到testDao這method又call一次。也許有解,但目前找不到。

arrow
arrow
    全站熱搜

    Jemmy 發表在 痞客邦 留言(0) 人氣()