4

私がテストしている機能の 1 つは、マシンへの sshing です。私は実際にマシンにsshしていないので、実際にマシンにsshしようとするpingメソッドをモックしたいと思います。

私がテストしているクラス:

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;
    }
}

テストクラスは次のようになります。

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

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

問題は、それらをローカルで実行しているときは問題なく動作することですが、自動構築システムでは、実際に実際の ping を呼び出して認証例外を取得しているように見えます。私は spy() の代わりに mock() を使用しますが、それは少し変だと読んだことがありますが、実際にメソッドを呼び出しているという点で何が違いを生むのか理解できません! 他の誰かが何か洞察を持っているかどうか疑問に思っています。

4

3 に答える 3

3

Mockito.spy() を使用する場合、void 以外のメソッドには 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"));
    }
}
于 2013-07-05T21:07:22.507 に答える
3

私の経験では、モックを使用して同じクラス内のメソッド間の相互作用をテストするべきではありません。

このことからわかることは、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

于 2011-02-08T11:16:23.070 に答える
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"));
     }
} 
于 2011-01-27T19:15:07.000 に答える