[英]android unit test + robolectric 3.0 + java.lang.LinkageError: loader constraint violation
Error:错误:
java.lang.LinkageError: loader constraint violation: when resolving method "com.example.demo.utils.R.init(Landroid/content/Context;)V" the class loader (instance of org/robolectric/internal/bytecode/InstrumentingClassLoader) of the current class, com/example/test/FirstTest, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the method's defining class, com/example/demo/utils/R, have different Class objects for the type android/content/Context used in the signature
java.lang.LinkageError:加载器约束冲突:解析方法“com.example.demo.utils.R.init(Landroid/content/Context;)V”时类加载器(org/robolectric/internal/bytecode/InstrumentingClassLoader的实例) ) 的当前类 com/example/test/FirstTest 和方法定义类 com/example/demo/utils/R 的类加载器(sun/misc/Launcher$AppClassLoader 的实例)具有不同的 Class 对象签名中使用的类型 android/content/Context
test code:测试代码:
@runwith(RobolectricGradleTestRunner.class)
@config(constants = BuildConfig.class,sdk = 21,application = TestApplication.class)
public class FirstTest{
@test
public void testCase01(){
MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);
....
}
}
build.gradle:构建.gradle:
dependencies {
testCompile 'junit:junit:4.12'
testCompile "org.robolectric:robolectric:3.0"
testCompile 'org.robolectric:shadows-httpclient:3.0'
...
}
src/test/java/.../TestApplication: src/test/java/.../TestApplication:
public class TestApplication extends Application {
}
com/example/demo/MainActivity: com/example/demo/MainActivity:
public class MainActivity extends Activity {
@override
protected void onCreate(Bundle savedInstanceState) {
...
com.example.demo.utils.R.init(getApplicationContext());
...
}
}
com/example/demo/utils/R: com/example/demo/utils/R:
public final class R {
public static Resources resources;
private static String packageName;
public static void init(Context paramContext) {
resources = paramContext.getResources();
packageName = paramContext.getPackageName();
}
...
}
I find the reason why tests run fail is using a class named com.example.demo.utils.R
, which has a conflict with an R
class autogenerated by the Android System.我发现测试运行失败的原因是使用名为
com.example.demo.utils.R
的类,该类与 Android 系统自动生成的R
类存在冲突。 If you rename R
to another name, like Ra
, it works.如果您将
R
重命名为另一个名称,例如Ra
,它会起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.