gpt4 book ai didi

java - 如何android单元测试和模拟静态方法

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:38 25 4
gpt4 key购买 nike

你好,我真的希望你能帮助我,我觉得我这几天一直在拔头发。

我正在尝试为方法 A 编写单元测试。方法 A 调用静态方法 B。我想模拟静态方法 B。

我知道以前有人问过这个问题,但我觉得 Android 从那时起就成熟了,一定有一种方法可以完成如此​​简单的任务,而无需重写我要测试的方法。

这是一个例子,首先是我要测试的方法:

public String getUserName(Context context, HelperUtils helper) {
if(helper == null){
helper = new HelperUtils();
}
int currentUserId = helper.fetchUsernameFromInternet(context);

if (currentUserId == 1) {
return "Bob";
} else {
return "Unknown";
}
}

接下来是我要模拟的静态方法:

public class HelperUtils {
public static int fetchUsernameFromInternet(Context context) {
int userid = 0;

Log.i("HelperUtils ", "hello");

return userid;
}
}

在其他语言中,这非常简单,但我就是无法在 Android 中使用它。我试过 Mockito,但似乎不支持静态方法

HelperUtils helper = Mockito.mock(HelperUtils.class);
Mockito.when(helper.fetchUsernameFromInternet(getContext())).thenReturn(1);

这个错误

org.mockito.exceptions.misusing.MissingMethodInvocationException

我已经尝试过 Powermock,但我不能完全确定 Android 是否支持它。我设法在我的 gradle 文件中使用 androidCompile 使 powermock 运行,但我收到此错误:

Error:Execution failed for task ':app:dexDebugAndroidTest'. com.android.ide.common.process.ProcessException:

更不用说 PowerMockito.mockStatic(HelperUtils.class); 不返回任何东西,所以我不知道要将什么传递到我的 getUsername 方法中!

非常感谢任何帮助。

最佳答案

静态方法与任何对象都不相关 - 您的 helper.fetchUsernameFromInternet(...)HelperUtils.fetchUsernameFromInternet(...) 相同(但有点令人困惑) - 由于此 helper.fetchUsernameFromInternet,您甚至应该收到编译器警告。

此外,您必须使用 @RunWith(...)@PrepareForTest(.. .) 然后是 PowerMockito.mockStatic(...) - 完整示例在这里:PowerMockito mock single static method and return object

换句话说 - 模拟静态方法(以及构造函数)有点棘手。更好的解决方案是:

  • 如果您可以更改 HelperUtils,使该方法成为非静态方法,现在您可以使用通常的 Mockito.mock 模拟 HelperUtils >

  • 如果您不能更改 HelperUtils,请创建一个包装类,它委托(delegate)给原始 HelperUtils,但没有 static 方法,然后还使用通常的 Mockito.mock(这个想法有时称为“不要模拟你不拥有的类型”)

关于java - 如何android单元测试和模拟静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074356/

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