JUnit - 扩展
以下是 JUnit 扩展 −
- Cactus
- JWebUnit
- XMLUnit
- MockObject
Cactus
Cactus 是一个简单的测试框架,用于对服务器端 Java 代码(Servlet、EJB、标签库、过滤器)进行单元测试。 Cactus 的目的是降低为服务器端代码编写测试的成本。 它使用 JUnit 并对其进行扩展。 Cactus 实现了容器内策略,在容器内执行测试。
Cactus 系统由多个组件组成 −
Cactus Framework 是 Cactus 的核心。 它是提供API来编写Cactus测试的引擎。
Cactus 集成模块是前端和框架,提供使用 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 遍历(通过 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(); } }