如何使用EasyMock对以下方法进行单元测试。我试图模拟WebResource,但它返回给我一个NullPointerException
。
public void connect()
{
Client client = setUpClient();
WebResource jobBuilder = client.resource("URL");
String jobXml = jobBuilder.accept(MediaType.APPLICATION_XML)
.type(MediaType.APPLICATION_JSON)
.entity(request)
.post(String.class);
}
public Client setUpClient()
{
ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client client = Client.create(cc);
return client;
}
答案 0 :(得分:2)
你显然必须阅读控制反转原理(http://en.wikipedia.org/wiki/Inversion_of_control),如果不是为了更好的设计代码,那么为了单元测试。上面方法中的客户端对象是使用静态工厂方法Client.create()在方法本身内创建的。使用该方法注入模拟协作者没有好办法。您应该允许通过setter或构造函数注入客户端,或者将其创建委托给某种工厂。
如果您使用第一种方法,您可以在单元测试设置期间通过setter或构造函数直接注入模拟客户端。
如果您使用第二种方法,则可以提供一个在调用时返回模拟客户端的工厂。
编辑5/03:
以下是通过为第三方库对象提供对象工厂来使代码可测试的示例:
public class ClassToTest {
private ClientFactory factory;
public ClassTotest() {
this(new ClientFactory());
}
public ClassToTest(ClientFactory factory) {
this.factory = factory;
}
public void connect() {
Client client = factory.getClient();
WebResource jobBuilder = client.resource("URL");
String jobXml = jobBuilder.accept(MediaType.APPLICATION_XML)
.type(MediaType.APPLICATION_JSON)
.entity(request)
.post(String.class);
}
}
public class ClientFactory() {
public Client getClient() {
ClientConfig cc = new DefaultClientConfig();
cc.getClasses().add(JacksonJsonProvider.class);
Client client = Client.create(cc);
return client;
}
}
现在,在您的应用程序代码中,您可以使用无参数构造函数实例化您的类。在单元测试中,您将使用其他构造函数。通过这种方式,您可以注入一个模拟客户端,您可以编写脚本来测试WebResource。
希望这有帮助。