4

我正在测试的功能之一是连接到一台机器上。我想模拟 ping 方法,它实际上试图 ssh 进入机器,因为我并没有真正 ssh 进入机器。

我正在测试的课程:

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 并获得身份验证异常。我将使用 mock() 而不是 spy() ,因为我读过它有点奇怪,但我只是不明白它实际上是在调用该方法有什么不同!只是想知道是否其他人有任何见解。

4

3 回答 3

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

高温高压

于 2011-02-08T11:16:23.070 回答
3

当您使用 Mockito.spy() 时,将 Mockito.doReturn() 用于非 void 方法或 Mockito.doNothing() 用于 void 方法。

在你的情况下:

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 回答
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 回答