java.lang.RuntimeException:Stub!在Android中使用Mockito

时间:2017-01-17 19:53:26

标签: java android unit-testing mockito powermock

我一直在Google上查看此错误,我发现的大部分答案都是将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)

记录行,从不会导致测试错误,我不知道在这种情况下发生了什么。

2 个答案:

答案 0 :(得分:3)

您可以尝试将以下选项添加到您的应用build.gradle

android {

    testOptions {
        unitTests.returnDefaultValues = true
    }
}

这可以防止您获得此RuntimeException,因为在这种情况下,Android-Methods将返回默认值。请注意,这可能会引发其他问题,例如:使用TextUtils.equals(...)时。

基本上我同意模拟被测单元的每个依赖关系的策略,但是你可以使用返回值作为一种解决方法。

答案 1 :(得分:1)

问题是您直接在模拟上调用方法。

你通常不这样做。

通常你在test(cut)下创建一个普通的类实例,并模拟它与之通信的依赖项:

@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);
}