你可以通过隐藏代码依赖的接口后面的服务和使用jmock伪装这些接口来测试任何东西。在本文中,graham king给出了如何在测试优先进是时构建简单的样例应用。他从简单的,容易测试的方法开始,逐步过滤到使用外部资源的方法。同时展示了如何使用接口及使用伪对象来简化测试。
版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:graham king;xmatrix(作者的blog:http://blog.matrix.org.cn/page/xmatrix)
原文:http://www.javaworld.com/javaworld/jw-11-2005/jw-1107-testing.html
译文:http://www.matrix.org.cn/resource/article/44/44197_unit+tests.html
关键字:unit;tests;java
我们将从构建简单的驼鹿监视软件开始示例各种场景下的测试驱动开发。
驼鹿是鹿家族中的最大个的成员。目前世界上估计有2百万头。为了更好的统计,世界驼鹿组织让我们开发一个驼鹿监视软件,希望保护人员能够跟踪和记录他们见到的驼鹿。
本文假设读者已经熟悉java/ant/maven/classpath,而且至少写过一两个简单的junit测试。
vanilla junit
首先编写moose类:
package moose;
import java.util.date;
public class moose {
private date datetimeobserved;
private int age;
public moose(date datetimeobservedparam, int estimatedage) {
this.datetimeobserved = datetimeobservedparam;
this.age = estimatedage;
}
}
public void testisolderthan() {
moose moose = new moose(new date(), moose_age);
asserttrue("moose age "+ moose_age +" should of been older than "+ test_age, moose.isolderthan(test_age) );
} boolean isolderthan(int contenderage) {
return this.age >= contenderage;
} public interface ranger {
string getname();
} ... above as before...
private ranger observer;
public moose( date datetimeobservedparam,
int estimatedage,
ranger observedby)
{
this.datetimeobserved = datetimeobservedparam;
this.age = estimatedage;
this.observer = observedby;
}
... below as before ...
public class testmoose extends mockobjecttestcase {
public void setup() throws exception {
super.setup();
}
public void teardown() throws exception {
super.teardown();
}
... the rest as before ... public void testobservername() {
mock rangermock = mock(ranger.class);
rangermock.expects( once() ).method("getname").will( returnvalue(ranger_name) );
moose moose = new moose(new date(), moose_age, (ranger) rangermock.proxy() );
assertequals("moose did not report correct ranger", ranger_name, moose.getobservername() );
} public interface messenger {
void sendmessage(string topic, object[] values);
} public class registry {
private static map registry = new hashmap();
public static void put(string key, object implementation) {
registry.put(key, implementation);
}
public static object get(string key) {
return registry.get(key);
}
} messenger messenger = (messenger) registry.get("messenger");
messenger.sendmessage(a_topic, somevalues);
public void testmessageissent() {
date observationdate = new date();
object[] valuearray = new object[] { observationdate, new integer(moose_age) };
mock messenger = mock(messenger.class);
messenger.expects( once() ).method("sendmessage").with( eq(message_topic), eq(valuearray) );
registry.put( "messenger", messenger.proxy() );
moose moose = new moose(observationdate, moose_age, null );
} public interface storagemanager {
void save(object objecttosave) throws storageexception;
}storagemanager storagemanager = (storagemanager) registry.get( registry.storage );
storagemanager.save( myobject );
public void testsave() throws storageexception {
// create a mock messenger than ignores any messages it gets
mock messenger = mock(messenger.class);
messenger.stubs().method("sendmessage");
registry.put( registry.messenger, messenger.proxy() );
// create the moose
moose moose = new moose(new date(), moose_age, null);
// create a mock storagemanager and tell it what will happen when we save the moose
mock storage = mock(storagemanager.class);
storage.expects( once() ).method("save").with( same(moose) );
registry.put(registry.storage, storage.proxy());
// test !
moose.save();
}messenger.stubs().method("sendmessage");
storage.expects( once() ).method("save").with( same(moose) );
moose.save();
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器