2013-05-03 36 views
1

如何使用EasyMock對以下方法進行單元測試。我試圖嘲笑WebResource,但它返回給我一個NullPointerException如何使用easy mock對剩餘呼叫進行單元測試

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

你能告訴我們你到目前爲止所嘗試過的嗎? – Zutty 2013-05-03 15:56:02

回答

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。

希望這會有所幫助。

+0

我已經將創建客戶端的代碼更改爲setter,但仍然無法模擬setter,因爲它是內部方法。你能否提供給我更多的見解。 – 2013-05-03 18:28:24

相關問題