gpt4 book ai didi

android - 如何使用 mock() 和 spy() 测试静态方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:04:43 25 4
gpt4 key购买 nike

下面在代码部分中发布的方法包含一个静态方法,即“with()”。我想测试下面的代码,所以我编写了这个方法的测试如测试部分所示。

我尝试同时使用“spy()”和“mock()”来测试该方法,但测试总是失败。

请告诉我如何测试返回 void 的方法?

代码

 public RequestCreator requestCreatorFromUrl(String picUrl) {
return Picasso.with(mCtx).load(picUrl);
}

测试:

public class ValidationTest {
@Mock
private Context mCtx = null;
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();

@Before
public void setUp() throws Exception {
mCtx = Mockito.mock(Context.class);
Assert.assertNotNull("Context is not null", mCtx);
}

@Test
public void whenRequestCreatorFromUrlTest() throws Exception {
Picasso picasso = Picasso.with(mCtx);
Picasso spyPicasso = spy(picasso);
Uri mockUri = mock(Uri.class);
RequestCreator requestCreator = Picasso.with(mCtx).load(mockUri);
RequestCreator spyRequestCreator = spy(requestCreator);

doReturn(spyRequestCreator).when(spyPicasso.load(mockUri));
//when(spyPicasso.load(mockUri)).thenReturn(spyRequestCreator);
RequestCreator actual = spyPicasso.load(mockUri);

Assert.assertEquals(requestCreator, actual);
}

最佳答案

通常,如果您最终使用了 PowerMock,那么这是一个好兆头,表明您很可能走错了路。

如果您不直接引用 Picasso,而是创建一个负责加载图像的组件,假设类 ImageLoader,会怎样?这会给你带来什么?

  • 关注点分离:如果明天您决定迁移到 Glide,您不应该更改您使用 Picasso 的每个类,您将只需更改 ImageLoader 的实现即可。其他组件对这些更改不敏感,因为它们依赖于抽象,实现

  • Seam:这将使您能够轻松地模拟依赖项以执行单元测试

这将是我们的抽象:



interface ImageLoader {
RequestCreator load(String url);
}

让我们提供一个实现:



class ImageLoaderImpl implements ImageLoader {

private final Picasso picasso;

public ImageLoaderImpl(Context context) {
this.picasso = Picasso.with(context);
}

@Override
public RequestCreator load(String url) {
return picasso.load(url);
}
}

现在,在您的组件中,只要您需要 Picasso,请改用 ImageLoader

因此,您的方法如下:



public static RequestCreator requestCreatorFromUrl(String picUrl) {
return imageLoader.load(picUrl);
}

那么您的测试将如下所示:



@Test
public void test() {
ImageLoaderImpl imageLoader = Mockito.mock(ImageLoaderImpl.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);
}

没有 static 方法的模拟,不需要 PowerMock

关于android - 如何使用 mock() 和 spy() 测试静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46276962/

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