我一直在谷歌上寻找这个错误,我找到的大多数答案都是将 junit 依赖移到顶部。或者使用另一个模拟框架。我已经移动了依赖项,但仍然失败,整个项目使用 mockito 和 powermock。
这是在简历中,代码。
package co.pack.session;
import com.google.gson.JsonObject;
import org.junit.Test;
import co.pack.Session.Organization;
import static org.junit.Assert.assertEquals;
public class TestOrganization {
@Test
public void testLoadJson() {
JsonObject json = new JsonObject();
json.addProperty("theme_color", "red");
Organization organization = new Organization();
organization.loadFromJson(json);
assertEquals("red", Organization.getThemeColor());
}
}
实现
public static void loadFromJson(JsonObject json) {
Organization.name = json.has("name") ? json.get("name").getAsString() : "";
Organization.image = json.has("image") ? json.get("image").getAsString() : "";
printActualOrganization();
}
private static void printActualOrganization() {
Log.i(TAG, "_name_ " + name);
Log.i(TAG, "_image_ " + image);
}
它在日志行上失败
Log.i(TAG, "_name_ " + name);
并得到了这个
java.lang.RuntimeException: Stub!
at android.util.Log.i(Log.java:9)
at co.mobico.Session.Organization.loadJson(Organization.java:50)
at co.mobico.session.TestOrganization.testLoadJson(TestOrganization.java:28)
日志行,永远不会在我的测试中引起任何错误,我不知道在这种情况下发生了什么。
您可以尝试将以下选项添加到您的应用程序build.gradle
。
android {
testOptions {
unitTests.returnDefaultValues = true
}
}
这应该会阻止你获得这个 RuntimeException,因为在这种情况下,Android-Methods 将返回默认值。请注意,这可能会引发其他问题,例如在使用 TextUtils.equals(...)
时。
基本上,我同意模拟被测单元的每个依赖项的策略,但是您可以使用返回值作为一种解决方法。
问题是你直接在模拟上调用一个方法。
你通常不会那样做。
通常,您创建待测试类(剪切)的普通实例,并模拟与之通信的依赖项:
@Test public void exampleWithMocks(){
// arrange
DataTransferObject dto = new DataTransferObject();
dto.setSomeProperty(SOME_PRIMITIVE_VALUE_OR_STRING);
SomeServiceTheCutDependsOn dependency = mock( SomeServiceTheCutDependsOn.class);
ClassUnderTest cut = new ClassUnderTest(dependency);
// act
Object result = cut.doSomethingWith(dto);
// assert
assertThat(result,notNullValue());
verify(dependency).expectedMethodCall(dto);
}