JUnit - 扩展

  • 简述

    以下是 JUnit 扩展 -
    • Cactus
    • JWebUnit
    • XMLUnit
    • MockObject
  • Cactus

    Cactus 是一个简单的测试框架,用于单元测试服务器端 Java 代码(Servlets、EJBs、Tag Libs、Filters)。Cactus 的目的是降低为服务器端代码编写测试的成本。它使用 JUnit 并对其进行扩展。Cactus 实现了一种在容器内执行测试的容器内策略。
    仙人掌生态系统由几个组件组成 -
    • Cactus Framework是Cactus的核心。它是提供 API 来编写 Cactus 测试的引擎。
    • Cactus Integration Modules 是提供使用 Cactus 框架(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 提供了一个高级 Java API,用于导航 Web 应用程序,并结合一组断言来验证应用程序的正确性。这包括通过链接导航、表单输入和提交、表格内容验证以及其他典型的商业 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(通过 Transform 类)转换一段 XML 的结果。
    • 对一段 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();
       }
    }