TestNG和JUnit 4.0都是非常优秀的测试框架,在很多人看来,这两者互不相容,非此即彼。如果在实际开发中,如果能将两者结合起来,同一份测试代码可以分别被Junit和TestNG调用,那将是非常好的事情。
达到这个目标其实并不难,TestNG和JUnit 4.0都使用了Java 5的Annotation机制,所以我们只需创建一个测试基类,同时包含TestNG和JUnit 4.0的Annotation即可,这样就能够同时满足TestNG和JUnit 4.0的要求。下面我们就以整合SpringFrameWork框架为例子讲解TestNG和JUnit 4.0的整合使用。
首先创建测试基类,名称为SpringContextTest,代码如下:
public class SpringContextTest
{
protected static ApplicationContext applicationContext;
@Configuration(beforeSuite = true)
@BeforeClass
public static void initContext()
{
applicationContext = new ClassPathXmlApplicationContext(getConfigLocations());
}
@Configuration(afterSuite = true)
@AfterClass
public static void destroyContext()
{
if (applicationContext instanceof AbstractApplicationContext)
{
((AbstractApplicationContext) applicationContext).close();
}
}
/**
* get Spring config files, please use classpath: or file: prefix
*
* @return Spring xml configuration files
*/
public static String[] getConfigLocations()
{
return new String[]{"file:/E:/source/intellij/webapp_template/WEB-INF/applicationContext.xml"};
}
}
在initContext和destroyContext方法中,我们同时使用TestNG和JUnit 4.0的Annotation,这样这个基类可以同时为TestNG和JUnit 4.0服务。JUnit4.0并没有提供对应的Suite方法的Annotation,这是一个缺憾。
下面我们就创建一个TestNG的测试类,很简单,只需继承测试基类,然后添加测试方法即可,代码如下:
public class SpringContainerTest extends SpringContextTest
{
@Test(invocationCount = 2)
public void testFive() throws Exception
{
UserPO user = (UserPO) applicationContext.getBean("User");
System.out.println(user.getLogonName());
}
}
同样的方法,我们可以创建适合JUnit 4.0的测试类,代码如下(这里我们添加了静态的suite方法):
public class SpringContainerTest extends SpringContextTest
{
public static junit.framework.Test suite()
{
return new JUnit4TestAdapter(SpringContainerTest.class);
}
@Test
public void testFive() throws Exception
{
UserPO user = (UserPO) applicationContext.getBean("User");
System.out.println(user.getLogonName());
}
}
通过这样的基类,同时整合了TestNG和JUnit 4.0的Annotation,我们可以享受到TestNG和JUnit 4.0带来的便捷。提示:在IntelliJ IDEA下,创建适合TestNG和JUnit 4.0的文件模板,会让测试类的创建更加简单。
在使用Struts框架进行Web开发时,StrutsTestCase是一个非常不错的Action测试框架,如果我们更改一下MockStrutsTestCase类,同时加入TestNG和JUnit 4.0的Annotation,同样可以达到适合TestNG和JUnit 4.0的目的。 |