我正在测试的功能之一是通过 ssh 登录到一台机器。我想模拟 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(),因为我读到它有点奇怪,但我只是不明白是什么造成了差异,因为它实际上是在调用该方法!只是想知道其他人是否有任何见解。
根据我的经验,您不应该使用模拟来测试同一类中方法之间的交互。
这告诉我们,您应该将 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)