在Mockito中如何在间谍对象条件下调用真实方法?

时间:2019-03-15 20:21:14

标签: java mocking mockito spy

我需要能够根据某种条件调用间谍对象的真实方法。即如果条件为true,则调用real方法,否则执行其他操作。

为清楚起见,我需要在第一次调用时引发异常,并在第二次调用时调用real方法。使用Mockito是否可以实现?

        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
        var url = "https://i1.adis.ws/i/jpl/jd_083285_a?qlt=80&w=600&h=425&v=1&fmt=webp";//baseUrl + productUrl;
        var result = await client.GetByteArrayAsync(new Uri(
        MemoryStream buf = new MemoryStream(result);
        var image = new BitmapImage();
        image.StreamSource = buf;
        this.ImageShoe.Source = image;

1 个答案:

答案 0 :(得分:2)

易于使用when(...).then(...),因为它允许模拟规范的“流畅链接”:

Object object = Mockito.spy(new Object());
Mockito.when(object.toString()).thenThrow(new RuntimeException()).thenReturn("yeha");

try {
  System.out.println(object.toString());
  fail();
} catch(RuntimeException r) {
  System.out.println(object.toString());
}

打印:

  

是的

是的!

很严重:无论如何,您都应该首选when(mock.foo()).then...(有关原因的列表,请参见here)。在某些情况下需要使用doReturn().when(),但如上所述:这是您的最后选择,而不是您的第一选择。