2011-01-27 76 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")); 
    } 
}