2017-07-28 65 views
0

我使用Powermock編寫測試用例的我的方法之一,它是這樣的一個非靜態方法不調用一個私有靜態方法:部分嘲諷裏面

class A{ 
    static String hello = "hello"; 
    private void static init(String s){ 
     hello = hello+" "+s; 
    } 
    public String getString(String s){ 
     init(s); 
     return hello; 
} 
} 

class B{ 
    A a = new A(); 
    public String printHelloWorld(){    
     return a.getString("World")+" from Hawaii";  
    } 
} 

我想測試getStringFromA通過使用PowerMock這樣嘲笑類A的方法的getString類B的方法:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(A.class) 
class TestClass{ 
    @Test 
    public void testMethod(){ 

     //Mock Creation 
     A dummy = createPartialMock(A.class,"getString",String.class); 

    //Expect 
    expectNew(A.class).andReturn(dummy); 
    expect(dummy.getString("World")).andReturn("Hello World"); 

    //Replay 
    replayAll(); 

    //Execute 
    B b = new B(); 
    b.printHelloWorld(); 
    } 
} 

的問題是,這似乎並沒有工作。類A的getString()方法不執行私有靜態方法init()。我認爲這是因爲我們在嘲笑方法getString()。但是,如果方法getString()也是靜態執行的,則轉到init方法。 這可能是這種異常的原因。

感謝, 瑪納斯

+0

'init()'是一個靜態方法,它試圖改變'hello',它是一個類成員。你不能在靜態方法裏面引用一個類成員!這段代碼甚至不會編譯。 – SHG

+0

@SHG:感謝您指出。糾正了錯誤。 –

回答

0

工程完全按照預期。從documentation

PowerMock.createPartialMock(ClassToPartiallyMock.class, 「nameOfTheFirstMethodToMock」, 「nameOfTheSecondMethodToMock」)來創建一個模擬對象,只有嘲笑與名nameOfTheFirstMethodToMock方法...

你是指示 PowerMock到模擬getString()。嘲弄意味着:這是一個虛擬的,沒做什麼東西

從這個意義上說:你應該退一步讀如何使用嘲諷做適當的單元測試。你甚至不清楚是否要測試A類或B類。

你看,要測試B類,你不需要PowerMock或部分模擬。你只需做這樣的事情:

A mockedA = mock(A.class); 
when(mockedA.getString("foo")).thenReturn("bar"); 

B underTest = new B(mockedA); 
assertThat(b.printHelloWorld(), is("bar from hawaii")); 

或類似的東西。以上是使用Mockito調用,但EasyMock沒有太大的不同。

的一點是:簡單地提供 A類的一個實例爲B,而不是B級中做new,和你需要加強嘲諷的功能完全消失。

換句話說:這裏不需要部分模擬。即使你想去部分嘲弄 - 仔細閱讀文檔。所有這些東西都是完全記錄。