如何使用easy mock对其余调用进行单元测试

时间:2013-05-03 15:50:12

标签: java unit-testing rest mocking easymock

如何使用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;
    }

1 个答案:

答案 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。

希望这有帮助。