JUnit - 扩展

以下是JUnit扩展 :

  • Cactus

  • JWebUnit

  • XMLUnit

  • MockObject

Cactus

Cactus是一个简单的测试框架,用于测试服务器端Java代码(Servlet,EJB,Tag Libs,Filters). Cactus的目的是降低为服务器端代码编写测试的成本.它使用JUnit并扩展它. Cactus实现了一个容器内策略来执行容器内的测试.

仙人掌生态系统由几个组成部分组成 :

  • Cactus Framework 是Cactus的核心.它是提供API来编写Cactus测试的引擎.

  • Cactus Integration Modules 是前端和框架,提供方便使用Cactus Framework的方法(Ant脚本,Eclipse插件和Maven插件).

以下代码演示了如何使用Cactus .

import org.apache.cactus.*;
import junit.framework.*;

public class TestSampleServlet extends ServletTestCase {
   @Test
   public void testServlet() {
      // Initialize class to test
      SampleServlet servlet = new SampleServlet();

      // Set a variable in session as the doSomething()
      // method that we are testing 
      session.setAttribute("name", "value");

      // Call the method to test, passing an 
      // HttpServletRequest object (for example)
      String result = servlet.doSomething(request);

      // Perform verification that test was successful
      assertEquals("something", result);
      assertEquals("otherValue", session.getAttribute("otherName"));
   }
}

JWebUnit

JWebUnit是一个基于Java的Web测试框架应用.它将现有的测试框架(如HtmlUnit和Selenium)与统一,简单的测试界面结合在一起,以测试Web应用程序的正确性.

JWebUnit提供了一个用于导航Web应用程序的高级Java API结合一组断言来验证应用程序的正确性.这包括通过链接导航,表单输入和提交,表格内容验证以及其他典型的商业Web应用程序功能.

简单的导航方法和随时可用的断言可以更快速地进行测试创建比仅使用JUnit或HtmlUnit.如果你想从HtmlUnit切换到其他插件,如Selenium(即将推出),则无需重写你的测试.

这是一个示例代码.

import junit.framework.TestCase;
import net.sourceforge.jwebunit.WebTester;

public class ExampleWebTestCase extends TestCase {
   private WebTester tester;
   
   public ExampleWebTestCase(String name) {
      super(name);
      tester = new WebTester();
   }
	
   //set base url
   public void setUp() throws Exception {
      getTestContext().setBaseUrl("http://myserver:8080/myapp");
   }
	
   // test base info
   @Test
   public void testInfoPage() {
      beginAt("/info.html");
   }
}

XMLUnit

XMLUnit提供单个JUnit扩展类XMLTestCase,和一组支持类,允许断言 :

  • 两段XML之间的差异(通过Diff和DetailedDiff类).

  • 一段XML的有效性(通过Validator类).

  • 使用XSLT转换XML片段的结果(通过Transform类).

  • 评估一段XML上的XPath表达式(通过实现XpathEngine接口的类).

  • DOM Traversal(通过NodeTest类)公开的XML片段中的各个节点.

让我们假设我们有两个XML要比较并声明它们是相等的.我们可以写一个像这样的简单测试类 :

import org.custommonkey.xmlunit.XMLTestCase;

public class MyXMLTestCase extends XMLTestCase {

   // this test method compare two pieces of the XML
   @Test
   public void testForXMLEquality() throws Exception {
      String myControlXML = "<msg><uuid>0x00435A8C</uuid></msg>";
      String myTestXML = "<msg><localId>2376</localId></msg>";
      assertXMLEqual("Comparing test xml to control xml", myControlXML, myTestXML);
   }
}

MockObject

在单元测试中,模拟对象可以模拟复杂的,真实的(非模拟的)对象的行为,因此当真实对象不可行或不可能合并到单元测试中时非常有用.

使用模拟对象进行测试的常见编码样式是 :

  • 创建模拟对象的实例.

  • 设置状态和期望值模拟对象.

  • 使用模拟对象作为参数调用域代码.

  • 验证模拟对象的一致性.

下面给出了使用Jmock的MockObject示例.

import org.jmock.Mockery;
import org.jmock.Expectations;

class PubTest extends TestCase {
   Mockery context = new Mockery();
   public void testSubReceivesMessage() {
      // set up
      final Sub sub = context.mock(Sub.class);

      Pub pub = new Pub();
      pub.add(sub);
    
      final String message = "message";
      
      // expectations
      context.checking(new Expectations() {
         oneOf (sub).receive(message);
      });

      // execute
      pub.publish(message);
      
      // verify
      context.assertIsSatisfied();
   }
}