JUnit扩展 Eclipse的JUnit插件 以下是JUnit扩展 - 仙人掌 JWebUnit的 XMLUnit测试 MockObject 仙人掌 仙人掌是一个简单的测试框架,用于单元测试服务器端Java代码(Servlets,EJBs,Tag Libs,Filters)。仙人掌的目的是降低编写服务器端代码测试的成本。它使用JUnit并对其进行扩展。仙人掌实现了容器内的策略,在容器内执行测试。 仙人掌生态系统由几个组件组成 - 仙人掌框架 是 仙人掌 的核心。它是提供API来编写Cactus测试的引擎。 仙人掌集成模块 是前端和框架,提供使用Cactus框架(Ant脚本,Eclipse插件和Maven插件)的简单方法。 以下代码演示了如何使用仙人掌。 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转换一段XML的结果(通过Transform类)。 在一段XML上评估XPath表达式(通过实现XpathEngine接口的类)。 由DOM Traversal公开的一段XML中的单个节点(通过NodeTest类)。 让我们假设我们有两段我们希望比较的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(); } } Eclipse的JUnit插件