我正在尝试进行以下简单的Presenter测试:
public class NewsPresenterTest {
private static List<News> NEWS_HEADLINES;
@Mock
private NewsRepository mNewsRepository;
@Mock
private Picasso mPicassoClient;
@Mock
private ChromeTabsWrapper mChromeTabsWrapper;
@Mock
private NewsContract.View mNewsView;
@Captor
private ArgumentCaptor<NewsDataSource.LoadNewsCallback> mLoadNewsCallbackCaptor;
private NewsPresenter mNewsPresenter;
@Before
public void setupNewsPresenter() {
// inject the mocks
MockitoAnnotations.initMocks(this);
mNewsPresenter = new NewsPresenter(mNewsRepository, new CompositeDisposable(), mPicassoClient, mChromeTabsWrapper);
mNewsPresenter.subscribe(mNewsView);
NEWS_HEADLINES = Lists.newArrayList(...);
}
@Test
public void loadHeadlinesNewsFromRepositoryAndLoadIntoView(){
// verify certain behavior
}
}
我似乎无法嘲笑mPicassoClient
,结果得到以下异常:
java.lang.ExceptionInInitializerError
at sun.reflect.GeneratedSerializationConstructorAccessor3.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
...more
Caused by: java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.os.Looper.getMainLooper(Looper.java)
at com.squareup.picasso.Picasso.<clinit>(Picasso.java:109)
... and more
根据堆栈信息,异常发生在mocks被初始化时,更准确地说是在这一行代码:
MockitoAnnotations.initMocks(this);
因此,模拟Picasso.class
失败了。我做错了什么?
Picasso
视为客户端而不是仅仅是一个视图层帮助程序。在我看到的大多数使用Glide
和Picasso
的示例中,只是在ViewHolder、Activity或Fragment中直接静态引用Glide或Picasso。 - David RawsonPicasso
视为视图层帮助程序确实简化了我的思考问题。因此,在测试视图时,我可能需要提供一个简单的Picasso模拟实现,但这排除了直接模拟它作为问题所问的解决方法,从而解决了这个问题。尽管这不是我最初想要的,但您的回答提供了一些有用的见解,因此我会接受它。再次感谢! - Catalin Ghita