通常情况下,如果你最终使用PowerMock,这是一个很好的迹象,表明你最有可能是错误的方式.
如果不是直接引用毕加索,而是创建一个组件,它的职责是加载图像,让我们说类ImageLoader.这会给你什么?
>关注点分离:如果明天你决定转移到Glide,你不应该改变你使用Picasso的每一个类,你只需要改变ImageLoader的实现.其他组件对这些更改并不了解,因为它们依赖于抽象,而不依赖于实现
> Seam:这将允许您轻松模拟依赖项以执行单元测试
这将是我们的抽象:
class ImageLoader {
RequestCreator load(String url);
}
让我们提供一个实现:
class ImageLoaderImpl implements ImageLoader {
private final Picasso picasso;
public ImageLoader(Context context) {
this.picasso = Picasso.with(context);
}
@Overrides
public RequestCreator load(String url) {
return picasso.load(url);
}
}
现在,在您需要Picasso的组件中使用ImageLoader.
因此,您的方法如下:
public RequestCreator requestCreatorFromUrl(String picUrl) {
return imageLoader.load(picUrl);
}
然后你的测试看起来像这样:
@Test
public void test() {
ImageLoader imageLoader = Mockito.mock(ImageLoader.class);
RequestCreator expected = Mockito.mock(RequestCreator.class);
String TEST_URL = "https://www.some.url/img.jpg";
when(imageLoader.load(TEST_URL)).thenReturn(expexted);
RequestCreator actual = clazzToTest.requestCreatorFromUrl(TEST_URL);
assertEquals(expected, actual);
}
没有模拟静态方法,不需要PowerMock.