扩展(Extensions)
以下是JUnit扩展 -
- Cactus
- JWebUnit
- XMLUnit
- MockObject
Cactus
Cactus是一个简单的测试框架,用于测试服务器端Java代码(Servlet,EJB,Tag Libs,Filters)。 Cactus的目的是降低为服务器端代码编写测试的成本。 它使用JUnit并扩展它。 Cactus实现了一个容器内策略,用于在容器内执行测试。
仙人掌生态系统由几个组成部分组成 -
Cactus Framework是Cactus Framework的核心。 它是提供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提供了一个高级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();
}
}