Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.RuntimeException:存根!与Mockito一起使用Android_Java_Android_Unit Testing_Mockito_Powermock - Fatal编程技术网

java.lang.RuntimeException:存根!与Mockito一起使用Android

java.lang.RuntimeException:存根!与Mockito一起使用Android,java,android,unit-testing,mockito,powermock,Java,Android,Unit Testing,Mockito,Powermock,我一直在谷歌上寻找这个错误,我找到的大多数答案是将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

我一直在谷歌上寻找这个错误,我找到的大多数答案是将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(标记“\u name”+name)

还有这个

java.lang.RuntimeException:存根

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)

日志行,在我的测试中不会导致任何错误,我不知道在这种情况下会发生什么。

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

你通常不会这么做

通常,您会为测试(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);
}

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

你通常不会这么做

通常,您会为测试(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);
}

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

android {

    testOptions {
        unitTests.returnDefaultValues = true
    }
}
这将阻止您获取此RuntimeException,因为在这种情况下,Android方法将返回默认值。请注意,这可能会引发其他问题,例如使用
TextUtils.equals(…)


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

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

android {

    testOptions {
        unitTests.returnDefaultValues = true
    }
}
这将阻止您获取此RuntimeException,因为在这种情况下,Android方法将返回默认值。请注意,这可能会引发其他问题,例如使用
TextUtils.equals(…)


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

尝试将robolectric添加到测试用例中,它起作用了!但是,我想从项目中删除robolectric,你知道另一种方法使它工作吗?谢谢。您可以将
Log
类包装到一个新类中(例如Logger)。然后,在你的
Logger
类中,你可以调用方法
Log.i(…)
,这样你就可以模拟你的类,避免直接调用Android APIsTry,将robolectric添加到你的测试用例中,它起作用了!但是,我想从项目中删除robolectric,你知道另一种方法使它工作吗?谢谢。您可以将
Log
类包装到一个新类中(例如Logger)。然后在
Logger
类中,您可以调用方法
Log.i(…)
,这样您就可以模拟您的类,避免直接调用AndroidAPIs@GhostCat原因是:您想要测试代码的行为,而不是模拟框架代码……我的意思是:测试方法调用模拟方法没有什么好的理由。我发现“通常”已经是一个太弱的语句了。@GhostCat如果您拒绝/不能更改为组合,则可以使用抽象方法测试抽象类inharitance@GhostCat
mock(AbstractClass.class,Mockito.CALL\u REAL\u METHODS)
但您必须与构造函数注入的依赖项斗争,因此,我不重新编译它,只是为了记录……我更改了对象真实实例的模拟,但仍然得到相同的错误。@GhostCat原因是:您想测试代码的行为,而不是模拟框架代码……我的意思是:测试方法调用模拟方法没有什么好的理由。我发现“通常”已经是一个太弱的语句了。@GhostCat如果您拒绝/不能更改为组合,则可以使用抽象方法测试抽象类inharitance@GhostCat
mock(AbstractClass.class,Mockito.CALL\u REAL\u METHODS)
但您必须与构造函数注入的依赖项斗争,所以我没有重新编译它,只是为了记录……我更改了对象的真实实例的模拟,但仍然得到相同的错误。谢谢!但是,它是一个具有旧gradle版本(1.0.+)的旧项目,并且没有此属性。我们没有更新太久,现在更新起来很复杂。谢谢!但是,它是一个具有旧gradle版本(1.0.+)的旧项目,并且没有此属性。我们没有更新它太长时间,现在更新它很复杂。