Happy3w

JUnit/Testng测试如何加载Spring框架的@Autowired属性。

2016.07.16
问题描述: 写了一个configuration类负责spring配置,其他类标注@Component让spring自己装配。 想用JUnit/TestNG进行测试,没有Spring启动如何为这些@Component类和@Autowired属性赋值呢? 一下懵了,研究了半天。 被测代码: 1、spring配置DataConfiguration.java如下:
@Configuration @Profile("dev") @PropertySource("classpath:/config/config_dev.properties") public class DataConfigDev extends DataConfig{ @Bean public Green getGreen() { Green t= new Green(); t.setName("ok"); return t; } }
2、Green类如下 注意:没有标注@Component,因为在Configuration已经配置了@Bean构造了(也可以改用@Component方式)
/** * * @version 2016年7月16日 下午2:35:10 * @author Happy3W Cherry * */ public class Green { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
解决方案: 共找到了两种加载方式。 方法一 :采用SpringUnit框架。 1、测试类需要采用SpringUnit,代码示例如下: /** * * @version 2016年7月16日 下午12:07:55 * @author Happy3W Cherry * */ @RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试 @ContextConfiguration (classes={DataConfigDev.class}) //加载配置文件 @ComponentScan(basePackages = {"com.happy3w.autobuy"}) @ActiveProfiles("dev") public class BaseTest { } 其中@ActiveProfiles("dev")表示启动configuration中表为"dev"的配置(可以是java或xml) 2、写一个“GreenTest”继承BaseTest。 /** * * @version 2016年7月16日 下午2:36:41 * @author Happy3W Cherry * */ public class GreenTest extends BaseTest{ @Autowired public Green green; @Test public void testGetName() { Assert.assertEquals("ok", this.green.getName()); } } 方法二:AnnotationConfigApplicationContext手动配置加载。 1、创建一个GreenTestByManual 类 public class GreenTestByManual { public Green green; @Test public void testGetName() { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.getEnvironment().setDefaultProfiles("dev"); ctx.register(DataConfigDev.class); ctx.refresh(); this.green=ctx.getBean(Green.class); Assert.assertEquals("ok", this.green.getName()); } }