gpt4 book ai didi

android - 如何在 Android 的单元测试中模拟 Picasso?

转载 作者:行者123 更新时间:2023-11-29 01:12:24 27 4
gpt4 key购买 nike

我有使用 Picasso 库的代码。

 @Inject
public RegistrationPresenter(UserData userData, Picasso picasso) {
this.userData = userData;
this.picasso = picasso;
}

@Override
public void attachView(RegistrationView view) {
super.attachView(view);
view.toggleKeyboardButton(false);
view.showFirstName(userData.getFirstName());
view.showLastName(userData.getLastName());
view.showEmail(userData.getEmail());
setImage();
}

private void setImage() {
String url = String.format(IMAGE_URL, userData.getId());
String tag = String.format(JPG_EXT, userData.getId());
picasso
.load(url)
.tag(tag)
.into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
//some actions
}

@Override
public void onBitmapFailed(Drawable errorDrawable) {
}

@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}

});
}

在我的演示者中,我通过 Dagger2 提供了 picasso

@Provides
@Singleton
Picasso providesPicasso() {
return Picasso.with(context);
}

在我的测试中,我使用了 Robolectric 和 Mockito,所以我模拟了 Picasso 并将其传递给演示者的构造函数

@Mock
Picasso picasso;

@Before
public void setUp() {
super.setUp();
MockitoAnnotations.initMocks(this);
mockData = new UserData();
mockData.setFirstName("Name");
mockData.setLastName("LastName");
mockData.setEmail("example@gmail.com");
mockData.setId("123456");

File mockCacheDir = mock(File.class);
Context mockAppContext = mock(Context.class);
when(mockContext.getApplicationContext()).thenReturn(mockAppContext);
when(mockContext.getApplicationContext().getCacheDir()).thenReturn(mockCacheDir);
when(view.getContext()).thenReturn(mockContext);
presenter = new RegistrationPresenter(mockData, picasso);
}

@Test
public void testAttachView() {
presenter.attachView(view); //fails here
verify(view).toggleKeyboardButton(false);
verify(view).showFirstName(mockData.getFirstName());
verify(view).showLastName(mockData.getLastName());
verify(view).showEmail(mockData.getEmail());
}

当我运行我的测试时,它因异常而失败

java.lang.NullPointerException
at com.squareup.picasso.Utils.createDefaultCacheDir(Utils.java:257)
at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:45)
at com.squareup.picasso.Utils$OkHttpLoaderCreator.create(Utils.java:424)
at com.squareup.picasso.Utils.createDefaultDownloader(Utils.java:250)
at com.squareup.picasso.Picasso$Builder.build(Picasso.java:832)
at com.squareup.picasso.Picasso.with(Picasso.java:662)

模仿 picasso 的正确方法是什么?

最佳答案

Don't mock File.您的测试很可能失败,因为需要真正的 File 实现。而是使用 TemporaryFolder规则:

@Rule
public TemporaryFolder folder = new TemporaryFolder();

@Before
public void setUp() {
// ...
when(mockContext.getApplicationContext().getCacheDir()).thenReturn(folder.newFolder()));
// ...
}

关于android - 如何在 Android 的单元测试中模拟 Picasso?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41997848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com