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制作任何自定义阴影?
我已经尝试过了:
但我得到各种编译错误,如
InstrumentingClassLoaderConfig 未找到Setup 未找到 如何在robolectric 3.0中正确使用自定义阴影?
应该避免自定义阴影,并且必须是最后的沟渠.只有在代码中无法进行太多重构时才会使用它,这会阻止您像本机方法调用一样运行测试.最好使用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运行的任何测试用例.