Mockito:检查是否存在互联网连接

时间:2016-12-05 21:26:25

标签: java unit-testing exception mockito

我正在测试一个服务类A,它正在从B类加载数据。他们的设置如下:

public class A {

    private B b;

    public A (B b)
        this.b = b;
    }

    public String getInfo() throws IOException {
        return b.getData()
    }

}

public class B {

    public String getData() throws IOException {
        //gets data from the internet
        //throws IOException if it can't connect to the internet
    }   

}

所以基本上我决定在我的setUp方法

中模仿它
private static A a;

@BeforeClass
public static void setUp() {
    B b = mock(B.class);
    when(b.getData()).then(invocation -> {
        try {
        final URL url = new URL("http://www.google.com");
        final URLConnection conn = url.openConnection();
      } catch (IOException ex) {
        throw new IOException(ex);
      }
      //some other operations follow after this, but they all work
      return "...";
    });
    this.a = new A(b);
}

测试调用A的getInfo()方法。每当我断开我的路由器(并在之后运行测试)时,它应该抛出一个异常(当我在模拟之外尝试它时,无论如何)。但是,在模拟时,它永远不会进入异常块 - 它只是传递openConnection()调用,就像没有问题一样。为什么会这样?

1 个答案:

答案 0 :(得分:0)

  

嗯,是的,但是如果没有联系,B应该抛出异常。所以基本上没有办法用Mockito做到这一点?

有可能:

@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Rule
public ExpectedException exception = ExpectedException.none();

@Mock B b;

@Test
public void getInfo_ExceptionThrownByB_ExceptionFallsThrough(){
   // prepare
   doThrow(new IOException("unitTest"))when(b).getData();
   A a = new A(b);
   // assert (before act because exceptions are special)
   exception.expect(IOException.class);
   exception.expectMessage("unitTest");
   // act 
   a.getInfo();
}

我认为重点是:(你自己)清楚你测试的是什么。你测试的任何东西(可能是,但通常不超过一个类)不应该被嘲笑。您在测试下编码的任何内容都应与交互进行模拟(除非该依赖是像DTO一样简单破坏,或者不太可能像JRE类那样改变,例如:集合)。