如何在robolectric 3.0中创建自定义阴影?

yit*_*al9 7 testing android shadows robolectric

我需要模拟一些自定义类(为它创建一个阴影).我已经阅读了http://robolectric.org/custom-shadows/如何做到这一点.

所以,我有一些课:

public class MyClass {

  public static int regularMethod() { return 1; }
}
Run Code Online (Sandbox Code Playgroud)

我创造了一个阴影:

@Implements(MyClass.class)
public class MyShadowClass {

  @Implementation
  public static int regularMethod() { return 2; }
}
Run Code Online (Sandbox Code Playgroud)

我在Test-class中设置了阴影:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, shadows={MyShadowClass.class})
public class MyTest {

  @Test
  public void testShadow() {
      assertEquals(2, MyClass.regularMethod());
  }
}
Run Code Online (Sandbox Code Playgroud)

但阴影没有使用.

java.lang.AssertionError: 
Expected :2
Actual   :1
Run Code Online (Sandbox Code Playgroud)

如何为RobolectricGradleTestRunner制作任何自定义阴影?

我已经尝试过了:

  1. http://www.codinguser.com/2015/06/how-to-create-shadow-classes-in-robolectric-3/
  2. https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app-tests/src/main/java/com/jiahaoliuliu/robolectricsample/RobolectricGradleTestRunner.java
  3. 使用Robolectric Custom阴影类模拟本机方法

但我得到各种编译错误,如

  • InstrumentingClassLoaderConfig 未找到
  • Setup 未找到

如何在robolectric 3.0中正确使用自定义阴影?

Kan*_*shk 5

应该避免自定义阴影,并且必须是最后的沟渠.只有在代码中无法进行太多重构时才会使用它,这会阻止您像本机方法调用一样运行测试.最好使用powermock或mockito来模拟该类或间谍的对象,而不是自定义阴影.如果它是静态方法,那么使用powermock.

在我们的项目中,我们有一个具有一些本机方法的类,它是应用程序中随处可用的配置类.所以我们将原生方法移动到另一个类并将其隐藏起来.那些本机方法使测试用例失败.

无论如何这里是如何在robolectric 3.0中定制阴影:

创建一个扩展RobolectricGradleTestRunner的自定义测试运行器:

public class CustomRobolectricTestRunner extends RobolectricGradleTestRunner {


public CustomRobolectricTestRunner(Class<?> klass) throws InitializationError {
    super(klass);
}

public InstrumentationConfiguration createClassLoaderConfig() {
    InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder();
    builder.addInstrumentedPackage("com.yourClassPackage");
    return builder.build();
}
Run Code Online (Sandbox Code Playgroud)

确保程序包不包含使用robolectric运行的任何测试用例.