使用 Robolectric 自定义影子 class 模拟本机方法
Mock native method with a Robolectric Custom shadow class
我有一个 class,其中包含一个常规方法和一个我想模拟的本机方法:
public class MyClass {
public int regularMethod() { ... }
public void native myNativeMethod();
}
我正在使用 Robolectric 来测试我的应用程序,并且我正在尝试找出一种使用 custom shadow class 来模拟这些方法的方法。这是我的影子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 class 模拟本机方法可能有点困难,但我认为以这种方式使用自定义阴影 class 会导致调用阴影 class 代码。
我猜 robolectric 不知道您的 class 应该被隐藏 ;)
这里是如何告诉 robolectric 你将隐藏一些不是 android sdk classes.
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());
}
}
}
对于 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();
}
}
我有一个 class,其中包含一个常规方法和一个我想模拟的本机方法:
public class MyClass {
public int regularMethod() { ... }
public void native myNativeMethod();
}
我正在使用 Robolectric 来测试我的应用程序,并且我正在尝试找出一种使用 custom shadow class 来模拟这些方法的方法。这是我的影子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 class 模拟本机方法可能有点困难,但我认为以这种方式使用自定义阴影 class 会导致调用阴影 class 代码。
我猜 robolectric 不知道您的 class 应该被隐藏 ;)
这里是如何告诉 robolectric 你将隐藏一些不是 android sdk classes.
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());
}
}
}
对于 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();
}
}