【发布时间】:2015-08-18 13:51:18
【问题描述】:
嗨,我真的希望你能帮助我,我觉得我这几天一直在拔头发。
我正在尝试为方法 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,但出现此错误:
错误:任务 ':app:dexDebugAndroidTest' 执行失败。 com.android.ide.common.process.ProcessException:
更不用说PowerMockito.mockStatic(HelperUtils.class); 不返回任何内容,所以我不知道将什么传递给我的 getUsername 方法!
非常感谢任何帮助。
【问题讨论】:
-
我没有正确的答案,但我最近绕过了单例和静态类,将它们替换为服务定位器模式。它使它们易于测试,并且每个类都需要几分钟才能转换。
-
我对其他语言的测试不太了解,但是在Java中,
static是测试的敌人。 -
您可能想看看 PowerMock (github.com/jayway/powermock)。它是一个测试框架,可让您测试困难的案例。
-
PowerMockito 只是提供了 PowerMock Mockito 风格的 API,从技术上讲,它们都做同样的事情
标签: java android unit-testing mockito powermock