2015-11-27 55 views
0

我正在嘗試爲我的方法創建JUnit測試。我有一個方法我們如何使用mockito獲得對象的搭乘

public a(int a, int b){ 
    a.setA(12); 
    Injec inj = new Injec(); 
    inj.check(); 
    return (a*b); 
} 

我想跳過這一部分,因爲它使用HTTP請求

Injec inj = new Injec(); 
inj.check(); 

我使用

when(Matchers.<Injec> anyObject().check()).thenReturn(null); 

但它給我的異常

+0

你能告訴你所得到的例外呢? –

+0

你傳遞給'when'的參數必須是模擬或間諜,而不是匹配器,所以這是行不通的。幾年前,我在Mockito wiki上撰寫了[關於模仿對象創建的文章](https://code.google.com/p/mockito/wiki/MockingObjectCreation)。你可能會發現它對你想在這裏實現的目標有所幫助。 –

回答

3

用的Mockito ,您將無法使用當前的代碼執行此操作。

問題是,方法a直接通過調用默認構造函數創建一個新的Injec對象本身。 Mockito無法嘲笑這個新實例,因爲它無法控制它。

因此,您需要重構您的代碼。有可能的解決方案夫婦:

  • 通過Injec實例作爲參數傳遞給a方法。這樣,你可以模擬實例,並對該方法進行模擬。
  • Injec實例注入到類中(例如使用構造函數注入)。

如果您正在使用JMockit,如@羅熱里奧指出,這是可能的,你只需要添加@Mocked Injec到您的測試類,並在創建時的Injec實例將被嘲笑。

+0

這就是爲什麼'Control of Inversion'被髮明的原因:http://stackoverflow.com/questions/9403155/what-is-dependency-injection-and-inversion-of-control-in-spring-framework –

0

使用JMockit你可以嘲笑你的Injec類,如下所示:

@RunWith(JMockit.class) 
public class MyTest 
{ 
    private ClassToTest underTest; 

    @Test 
    public void testA(@Mocked Injec injec) { 
     underTest.a(10, 20); 

     // your assertions 
    } 
} 
相關問題