使用Robolectric Custom阴影类模拟本机方法

时间:2015-01-27 23:20:11

标签: class mocking shadow robolectric

我有一个带有常规方法的类和一个我想模拟的本机方法:

public class MyClass {

  public int regularMethod() { ... }
  public void native myNativeMethod();

}

我正在使用Robolectric来测试我的应用,我正试图找出一种使用custom shadow class来模拟这些方法的方法。这是我的影子课:

@Implements(MyClass.class)
public class MyShadowClass {

  @Implementation
  public int regularMethod { return 0; }

  @Implementation
  public void nativeMethod { ... }

}

这是我的测试:

@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class MyTest {

  @Test
  @Config(shadows = { MyShadowClass.class })
  public void test() {
    MyClass obj = new MyClass();
    Assert.assertEquals(obj.regularMethod(), 0);
  }

}

这不符合我的想法。模拟本机方法可能是Shadow类的延伸,但我认为以这种方式使用自定义阴影类会导致调用阴影类代码。

2 个答案:

答案 0 :(得分:2)

我猜robolectric不知道你的班级应该被遮蔽;)

以下是如何告诉robolectric你会影响一些不是android sdk类。<​​/ p>

public class MyRobolectricTestRunner extends RobolectricTestRunner {

@Override
protected ClassLoader createRobolectricClassLoader(Setup setup, SdkConfig sdkConfig) {
    return super.createRobolectricClassLoader(new ExtraShadows(setup), sdkConfig);
}

class ExtraShadows extends Setup {
    private Setup setup;

    public ExtraShadows(Setup setup) {
        this.setup = setup;
    }

    public boolean shouldInstrument(ClassInfo classInfo) {
        boolean shouldInstrument = setup.shouldInstrument(classInfo);
        return shouldInstrument
                || classInfo.getName().equals(MyClass.class.getName());
    }
}
}

答案 1 :(得分:0)

对于robolectric 3. +:

创建一个扩展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();
    }
}