2011-01-27 72 views
2

我正在測試的功能之一是將sshing放入機器。我想嘲笑ping方法,實際上它試圖將ssh放入一臺機器中,因爲我並不是真正意識到一臺機器。Mockito並沒有嘲笑電話

類我測試:

public class TestMachine { 
    public int ping(host){ 
    } 

    public boolean machineIsGood(host) { 
     blah blah 
     int val = ping(host); 
     blah blah blah 
     if(val != 0) return false; 
     return true; 
    } 
} 

測試類是這樣的:

的問題是,當我在本地運行它們,它們工作得很好,但我們autobuild系統,它似乎實際上是調用真正的ping並獲得認證異常。 我打算使用mock()而不是間諜(),因爲我讀過它有點奇怪,但我不明白是什麼改變了它實際上調用的方法!只是想知道是否有其他人有任何見解。

+0

好了,所以我加了模擬,而不是間諜,而是通過自動構建,因爲我在ping方法得到的NPE現在還沒有運行它(它依賴於一些私人變量,因爲它被嘲弄,所以我不能設置它),這就是我原來爲什麼要窺探的原因。有沒有什麼辦法可以解決這個問題,而不需要大量的代碼重構,還是我唯一的路徑? – Th3sandm4n 2011-01-27 17:50:46

回答

2
public class TestClass { 
    private TestMachine tester; 
    public void setUp() {   
    tester = mock(TestMachine.class);  
    }  

    public void testOne() { 
      when(tester.ping(anyString()).thenReturn(-1); 
      assertFalse(tester.machineIsGood("testHost")); 
    } 
} 
+0

唯一的問題是,在它使用一些私有變量(這是因爲類被嘲笑沒有實例化)。看起來我只是不得不重構代碼,以使測試更友好。 – Th3sandm4n 2011-01-27 20:33:16

2

根據我的經驗,您不應該使用mock來測試同一類中方法之間的交互。

這告訴我們的是,您應該將您的SUT(待測系統)與外部依賴關係解耦,您需要用測試雙取代(您不想在單元中「真實地」調用ping命令測試)。


public class Pinger { 
    public int ping(String host) { 
     // yadda yadda 
    } 
} 

public class TestMachine { 

    private final Pinger pinger; 

    public TestMachine(final Pinger pinger) { 
     this.pinger = pinger; 
    } 

    public boolean machineIsGood(host) { 
     // blah blah 
     int val = pinger.ping(host); 
     // blah blah blah 
     return val == 0; 
    } 
} 

public class TestMachineTest { 
    @Test 
    public void testOne() { 
     final Pinger pinger = mock(Pinger.class); 
     when(pinger.ping(anyString())).thenReturn(-1); 

     TestMachine tester = new TestMachine(pinger); 
     assertFalse(tester.machineIsGood("testHost")); 
    } 
} 

HTH

2

當您使用Mockito.spy(),使用Mockito.doReturn()用於非void的方法或Mockito.doNothing()爲無效的方法。

你的情況:

public class TestClass { 
    public void setUp() { 
     TestMachine tester = Mockito.spy(new TestMachine()); 
    } 

    public void testOne() { 
     doReturn(-1).when(test).ping(Mockito.anyString()) 
     assertFalse(tester.machineIsGood("testHost")); 
    } 
}