2017-02-04 134 views
1

我是Mockito新手,請幫助理解基本。模擬方法沒有被調用 - java

根據我上面的代碼應該打印5時mocked.add(6,7)得到調用,但add()方法沒有被調用和代碼打印0 ..爲什麼?這個代碼的任何解決方案?

import org.mockito.Mockito; 

    import static org.mockito.Mockito.*; 


    class Calc{ 

     int add(int a,int b){ 
     System.out.println("add method called"); 
     return a+b; 
    } 

}

 class MockTest{ 
      public static void main(String[] args) { 
      Calc mocked=mock(Calc.class); 
      when(mocked.add(2,3)).thenReturn(5); 
      System.out.println(mocked.add(6,7)); 
     } 
     } 
+1

你的問題是沒有意義的我。你明確地說mockito「當參數是2和3,然後返回5」,然後你傳遞6和7 ...爲什麼mockito應用該規則,如果前提條件不滿足? – Tom

回答

1

爲了得到個結果,你必須通過精確的PARAMS當您設置when..then作爲。否則的Mockito會返回一個「默認」值(整數0:

值都嘲笑默認情況下,什麼樣的回報

爲了透明和不引人注目所有的Mockito嘲笑由 默認返回「好「值。例如:。零,falseys,空 集合或空值參考的javadoc約磕碰,看看到底 默認情況下返回什麼值

如果你想返回5的任意整數,然後使用:

when(mocked.add(Mockito.any(Integer.class),Mockito.any(Integer.class))).thenReturn(5); 
0

「模擬」只是一個空虛擬對象,它模擬「真實」對象的行爲。如果您定義類似when(mocked.add(2,3)).thenReturn(5);的行爲,那麼當您收到這些確切的值時,您可以具體說明該模擬該做什麼。

mocked.add(6,7)將在此時返回0,因爲你還沒有定義其行爲的價值,因此使用默認值。因此,如果您想要涵蓋所有可能的輸入,可以使用@MaciejKowalski發佈的解決方案,並使用像Mockito.any(Integer.class)這樣的通用匹配器。

我仍然不清楚如何正確處理嘲笑。 Mock是一種向被測系統提供外部依賴的方法,無需設置整個依賴關係樹。通常不會調用該類中的真正方法。這就是when(mocked.add(2,3)).thenReturn(5);的意思。它告訴模擬行爲像真正的依賴關係,沒有真正的依賴。

一個例子可能是這樣的:

public class TestClass { 
    private ExternalDependency dep; 
    public void setDep(ExternalDependency dep) { 
     this.dep = dep; 
    } 
    public int calculate() { 
     return 5 + dep.doStuff(); 
    } 
} 

public class ExternalDependency { 
    public int doStuff() { 
     return 3; 
    } 
} 

現在,在您的測試代碼,你可以使用嘲笑這樣的:

@Test 
public void should_use_external_dependency() { 
    // Aquire a mocked object of the class 
    ExternalDependency mockedDep = Mockito.mock(ExternalDependency.class); 
    // Define its behaviour 
    Mockito.when(mockedDep.doStuff()).thenReturn(20); 

    TestClass sut = new TestClass(); 
    sut.setDep(mockedDep); 

    // should return 25, since we've defined the mocks behaviour to return 20 
    Assert.assertEquals(25, sut.calculate()); 
} 

如果sut.calculate()被調用時,在ExternalDependency的方法不應該是真的稱爲,它委託給嘲弄的存根對象。但是,如果你要撥打的真正類的真正方法,你可以使用一個間諜,而不是與Mockito.spy(ExternalDependency.class)或者你可以做到這一點與when(mockedDep.doStuff()).thenCallRealMethod();