2017-04-07 56 views
0

我有下面的類如何注入模擬,而無需使用@injectmocks

public class One { 
    private Map<String, String> nodes = new HashMap<String, String>(); 

    public void addNode(String node, String nodefield){ 
     this.nodes.put(node, nodefield); 
    } 
} 

我想編寫一個測試類來測試ADDNODE方法有以下幾種:

@RunWith(MockitoJUnitRunner.class) 
public class OneTest { 
    @InjectMocks 
    private One one = new One(); 

    @Mock 
    Map<String, String> nodes; 

    @Test 
    public void testAddNode(){ 
     one.addNode("mockNode", "mockNodeField"); 
     Mockito.verify(nodes).put("mockNode","mockNodeField"); 
    } 
} 

其中工程。但我不知道是否有一種方法可以做到這一點,而無需使用@InjectMocks像下面

public class OneTest { 

    private One one; 

    @Test 
    public void testAddNode(){ 
     Map<String, String> nodes = Mockito.mock(Map.class); 

     one = Mockito.injectmocks(One.class, nodes); // or whatever equivalent methods are 

     one.addNode("mockNode", "mockNodeField"); 
     Mockito.verify(nodes).put("mockNode","mockNodeField"); 
    } 
} 

回答

0

好吧,我想通了通過使用PowerMockito而不是普通的Mockito。

public class OneTest { 

    private One one; 

    @Test 
    public void testAddNode(){ 
     HashMap nodes = PowerMockito.mock(HashMap.class); 
     PowerMockito.whenNew(HashMap.class).withNoArguments().thenReturn(nodes); 


     One one = new One(); 

     one.addNode("mockNode", "mockNodeField"); 
     Mockito.verify(nodes).put("mockNode","mockNodeField"); 
    } 
} 

不過,我真的不知道是什麼PowerMockito這是否確實的Mockito這樣做使它雖然工作。

+0

你真正需要的是一個反射實用程序來訪問私有財產。一旦你訪問他們,然後你可以使用間諜或模擬。間諜更好,因爲你只是想專注於一個實例。如果你仍然使用1.x版本,Mockito有內部類白盒。如果你碰巧使用Spring,Spring有ReflectionUtil。 – Baski

+0

我最近重新討論了這個問題,發現ReflectionTestUtils是一個更好的解決方案。我在這裏找到了很好的閱讀材料,並希望分享:http://mrhaki.blogspot.com/2010/09/private-spring-dependency-injections.html。我試圖遠離PowerMock,因爲我讀到這不是最佳實踐。謝謝(你的)信息! – dejonathan

0

如何更改類通過注入映射爲依賴?這使得它更容易測試併爲您提供了能夠使用Map接口的實現,例如額外的好處:

public class One { 

    private Map<String, String> nodes; 

    public One(Map<String, String> nodes) { 

     this.nodes = nodes; 

    } 

    public void addNode(String node, String nodefield){ 

     this.nodes.put(node, nodefield); 

    } 
} 

然後進行測試:

Map mockMap = Mockito.mock(Map.class); 

One one = new One(mockMap); 

one.addNode("mockNode", "mockNodeField"); 

Mockito.verify(mockMap).put("mockNode","mockNodeField"); 
+0

是的,我也想到了。但我實際上正在爲不是由我寫的課程進行測試。這個類已經有了一個構造函數。上面的代碼只是實際類的簡單版本供解釋。那麼在沒有改變原始類的情況下,沒有辦法爲addNode方法編寫測試嗎? – dejonathan

相關問題