2013-01-24 70 views
1

我想測試ClassToTest類的方法methodToTest。但我無法做到這一點,因爲methodToTest正在調用的私有方法anotherMethod與使用其公有方法getName的單例類SingletonClass返回的值有一定的依賴關係。在java中使用私有方法模擬外部呼叫

我嘗試使用powermock的privateMethod模擬和靜態方法模擬和所有,但沒有幫助。
有沒有人有這種情況下的解決方案?

Class ClassToTest{ 
    public void methodToTest(){ 
     ... 
     anotherMethod(); 
     ... 
    } 

    private void anotherMethod(){ 
     SingletonClass singletonObj = SingletonClass.getInstance(); 
     String name = singletonObj.getName(); 
     ... 
    } 
} 
+0

重複? [看到這個](http://stackoverflow.com/questions/2302179/mocking-a-singleton-class)。另外,如果你能夠修改ClassToTest(?),那麼減弱對單例的依賴是有利的。 – Pyranja

回答

0

使用mockStatic(見http://code.google.com/p/powermock/wiki/MockitoUsage13#Mocking_Static_Method

@RunWith(PowerMockRunner.class) 
@PrepareForTest({SingletonClass.class}) 
public class ClassToTestTest { 
    @Test 
    public void testMethodToTest() { 
     SingletonClass mockInstance = PowerMockito.mock(SingletonClass.class); 
     PowerMockito.mockStatic(SingletonClass.class); 
     PowerMockito.when(SingletonClass.getInstance()).thenReturn(mockInstance); 
     PowerMockito.when(mockInstance.getName()).thenReturn("MOCK NAME"); 

     //... 
    } 
} 
0

您應該能夠使用部分模擬來處理這種情況。這聽起來像你想創建一個對象的實例,但你只想看看對象是否調用anotherMethod()方法而不實際執行其他方法中的任何邏輯。如果我的理解正確,以下內容應該能夠實現您的目標。

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ClassToTest.class}) 
public class ClassToTestTest { 
    @Test 
    public void testMethodToTest() { 
     ClassToTest mockInstance = 
        PowerMock.createPartialMock(SingletonClass.class,"anotherMethod"); 
     PowerMock.expectPrivate(mockInstance, "anotherMethod"); 
     PowerMock.replay(mockInstance); 
     mockInstance.methodToTest(); 
     PowerMock.verify(mockInstance); 
    } 
}