2014-11-08 73 views
0

我有一個單獨的類「假」爲什麼在嘗試使用Mockito或PowerMock模擬單例時不會拋出任何異常?

public class Fake{ 

private static Fake instance; 

private Fake(){ 

} 
public static Fake getInstance(){ 
    if(instance == null) 
     instance = new Fake(); 
    return instance; 
} 

public String getTestString(String s){ 
    return s; 
} 
} 

我想創建一個模擬假的對象,所以我可以嘲笑方法調用非靜態方法getTestString(String s)將。我用下面的方式使用了Mockito和PowerMock(Mockito擴展)。

//using Mockito 
Fake fake = Mockito.mock(Fake.class); 

//using PowerMock 
Fake fake = mock(Fake.class); 

在這兩種情況下,由於代碼試圖嘲笑單身(有私人的構造函數)我希望能出現異常,但它只是正常工作。我懷疑它有什麼問題,也許它實際上不起作用。

回答

1

Mocking不會實例化一個類,它會爲它創建一個代理。擁有一個私有構造函數或帶參數的構造函數並沒有什麼區別。

你看到的行爲是正常的和預期的。

0

通過使用嘲諷,它意味着您不是在測試類本身,而是要指定類的行爲,以便以任意方式執行您想要的操作。

這個模擬只在你試圖測試一些其他類對模擬類有依賴時纔有用。

就你而言,如果你想測試這個類是一個單例,你應該測試一個REAL實例,而不是模擬該類。

而且,你的方法:

public String getTestString(String s){ 
    return s; 
} 

總是返回你傳遞的字符串,這看起來不正確對我不知道你正試圖在這裏做。

0

因爲你從來沒有創建一個假的實際實例,只有一個實現Fake接口的代理實例,所以模擬成功。

另外,無論Fake的構造函數是否爲private,Mockito都不能存根或驗證靜態方法。如果你的真正目標是重寫getInstance,you'll need to do so with PowerMock

然而,通過調整你的系統下測試,你可以跳過Powermock與的Mockito直接測試你的方法:

public class YourSystemUnderTest { 
    public int yourMethodUnderTest() { 
    return yourMethodUnderTest(Fake.getInstance()); 
    } 

    /** Visible for testing. */ 
    int yourMethodUnderTest(Fake fake) { 
    // ... 
    } 
} 

public class YourTest { 
    @Test 
    public void yourMethodShouldReturn42() { 
    Fake fake = mock(Fake.class); 
    YourSystemUnderTest systemUnderTest = new YourSystemUnderTest(); 
    assertEquals(42, systemUnderTest.yourMethodUnderTest(fake)); 
    } 
} 

那就更簡單了,如果YourSystemUnderTest需要在其構造假的情況下,因爲這樣你可以在setUp()或@Before方法中設置對Fake實例的引用。

相關問題