2015-09-19 28 views
0

我有一個接口安卓:</p> <pre><code>public RealMath implements Example{ public int sum(int a, int b){ //contact server do stuff and return value. return val; } public int diff(int a, int b){ //contact server do stuff and return value. return val; } } </code></pre> <p>而且還有一個工廠:使用接口

public interface Example{ 

public int sum(int a, int b); 

public int diff(int a, int b); 

} 

現在我對這個接口的實現類的測試過程中提供了一個嘲笑實現提供相應的實現:

public class ExampleFactory(){ 
public static final Example getExampleIns(String val){ 
return new RealMath(); 
} 
} 

現在,我有一個類User.java其中使用這個Example接口進行一些工作。 我想測試User,其中有是調用一個方法:

Example ex = ExampleFactory.getExampleIns(); 
ex.sum(val1, val2); 

並基於該值是進行一些處理。

我想單元測試我的代碼,並希望有一個模擬的示例接口的實現,以便服務器依賴不是必需的,我只是返回接口中方法的一些模擬值。

我的想法是在調用ExampleFactory.getExampleIns();時(當測試用例正在運行時)提供我的嘲諷實現。

我厭倦了Mockito(Android),並且不支持靜態方法嘲諷。

所以我有兩個問題: 1.上述設計有什麼問題,我有一個工廠和各種實現,並根據需求返回適當的對象?

  1. 我如何測試User.java通過提供Example接口的模擬實現?

謝謝。

回答

1
  1. 有什麼不對上述設計,我有一個工廠和各種實現方式,並返回根據 要求合適的對象?

你在工廠提供的實現硬編碼,所以,如果你想改變的執行,你必須改變的代碼。您無法動態更改impl。

2.-如何測試User.java通過爲示例接口提供我的模擬實現?

而不是使用工廠,使用依賴注入。你可以傳遞的Example正確執行你的User在構造函數(例如),並將其存儲爲一個實例變量,這樣你以後可以使用它:

private Example exampleImpl; 

public User(Example exampleImpl) { 
    this.exampleImpl = exampleImpl; 
} 

public void methodUsingExample(Integer val1, Integer val2) { 
    exampleImpl.sum(val1, val2); 
} 

測試時,您建造User實例與Example模擬:

Example mockExample = mock(Example.class); 
User user = new User(mockExample); 
// now User is using your mock 
user.methodUsingExample(1, 2); 
相關問題