通常情況下,如果你最終使用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.