package org.test4j.module.spring.strategy; import java.util.List; import java.util.Map; import org.junit.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.test4j.fortest.beans.User; import org.test4j.fortest.service.BeanClazzUserServiceImpl; import org.test4j.fortest.service.UserDao; import org.test4j.fortest.service.UserServiceImpl; import org.test4j.module.database.IDatabase; import org.test4j.module.spring.ISpring; import org.test4j.module.spring.annotations.SpringInitMethod; import org.test4j.module.spring.strategy.Child; import org.test4j.module.spring.strategy.Test4JSpringContext; import org.test4j.module.spring.strategy.LazySpringContext; import org.test4j.module.spring.strategy.Parent; import org.test4j.module.spring.utility.SpringModuleHelper; @SuppressWarnings({ "rawtypes" }) public class LazySpringContextTest extends Child implements IDatabase, ISpring { Map<Class, Test4JSpringContext> SHARED_SPRING_CONTEXT = reflector.getStaticField(SpringModuleHelper.class, "SHARED_SPRING_CONTEXT"); /** * 容器启动前,共享的spring容器应该不存在 */ @SpringInitMethod protected void checkSharedSpring() { Test4JSpringContext context = SHARED_SPRING_CONTEXT.get(Parent.class); want.object(context).isNull(); } /** * 共享sping容器只加载定义Annotation类或其父类的@SpringBeanFrom,其子类的应该被忽略 */ @Test public void testGetTestedClazzz() { LazySpringContext context = reflector.newInstance(LazySpringContext.class); Class claz = reflector.invoke(context, "getTestedClazzz"); want.string(claz.getName()).isEqualTo(Parent.class.getName()); } /** * 共享sping容器只加载定义Annotation类或其父类的@SpringBeanFrom,其子类的应该被忽略 */ @Test public void testSpringBeanFrom_DefineInChild() { try { spring.getBean("map"); want.fail(); } catch (NoSuchBeanDefinitionException e) { String msg = e.getMessage(); want.string(msg).contains("No bean named 'map' is defined"); } } /** * 共享spring容器模式下,定义在Annotation声明类中的@SpringBeanFrom应该被加载 */ @Test public void testLazySpringContext_SpringBeanFrom() { UserDao bean = spring.getBean("userDao"); List<User> users = bean.findAllUser(); want.list(users).sizeEq(1); } /** * 共享容器中@SpringBeanByName的claz属性被无视,动态加载无效 */ @Test public void testLazySpringContext_SpringBeanByName() { want.object(this.userService).clazIs(UserServiceImpl.class); try { want.object(this.userService).clazIs(BeanClazzUserServiceImpl.class); want.fail(); } catch (AssertionError e) { } } /** * 容器启动后,共享的spring容器应该被存在SpringModuleHelper变量SHARED_SPRING_CONTEXT中 */ @Test public void testShareSpring() { Test4JSpringContext context = SHARED_SPRING_CONTEXT.get(Parent.class); want.object(context).notNull(); } }