2016-10-14 62 views
2
Class to be tested 
    public class ClassUnderTest { 
    public void functionA() { 
     functionB(); 
     functionC(); 
    } 
    private void functionB() { 
    } 
    private void functionC() { 
    } 
} 

測試類PowerMock不驗證私人電話不止一次

@RunWith(PowerMockRunner.class) 
public class TestClass { 
     @Test 
     public void testFunctionA() throws Exception { 
      ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest()); 
      classUnderTest.functionA(); 
      PowerMockito.verifyPrivate(classUnderTest).invoke("functionB"); 
      PowerMockito.verifyPrivate(classUnderTest).invoke("functionC"); 
     } 
    } 

在執行測試類,我發現了以下錯誤,

org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here: 
-> at org.powermock.api.mockito.PowerMockito.verifyPrivate(PowerMockito.java:312) 

Example of correct verification: 
    verify(mock).doSomething() 

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods. 
Those methods *cannot* be stubbed/verified. 
Mocking methods declared on non-public parent classes is not supported. 

如果一個驗證評論則測試案例工作正常。

+0

你好@bharanitharan兩行,你有什麼辦法解決?我有同樣的問題... – Abdelhafid

回答

2

您必須在PrepareForTest中添加ClassUnderTest。

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClassUnderTest.class) 
public class TestClass { 

@Test 
public void testFunctionA() throws Exception { 
    ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest()); 
    classUnderTest.functionA(); 

    PowerMockito.verifyPrivate(classUnderTest).invoke("functionB"); 
    PowerMockito.verifyPrivate(classUnderTest).invoke("functionC"); 
} 

我剛纔說sysouts在&運行測試類的私有方法。

0

另一個想法:不要那樣做。做不是驗證私人方法。這些方法是私人的原因。你應該儘量避免編寫必須知道某些私有方法被調用的測試。

你看,私人的想法是:它可能會改變。一個好的單元測試與一起工作,觀察你的類的行爲 - 你用不同的參數調用公共方法;並檢查回來的結果。或者,也許你使用依賴注入來爲你的測試類提供模擬對象 - 當你的測試代碼需要其他方法來完成它的工作時。

但你應該真的不是開始檢查私人方法。重點是:這些私人方法應該做一些從外部可以觀察到的事情。要麼他們在最終的「回報」價值上工作;或者他們改變了一些可能以其他方式檢查的內部狀態。換句話說:如果那些私人方法不會對您的班級造成任何其他影響 - 無論如何他們的目的是什麼?

+0

我同意你的觀點,你不應該測試私人方法。但在這種情況下,我只需要驗證私有方法是否已被調用。 – bharanitharan

0

你可以嘗試添加的代碼

@RunWith(PowerMockRunner.class) 
 
public class TestClass { 
 
     @Test 
 
     public void testFunctionA() throws Exception { 
 
      ClassUnderTest classUnderTest = PowerMockito.spy(new ClassUnderTest()); 
 
      PowerMockito.doNothing().when(classUnderTest, "functionB"); 
 
      PowerMockito.doNothing().when(classUnderTest, "functionC"); 
 
      classUnderTest.functionA(); 
 
      PowerMockito.verifyPrivate(classUnderTest).invoke("functionB"); 
 
      PowerMockito.verifyPrivate(classUnderTest).invoke("functionC"); 
 
     } 
 
    }