我正在整合自定义小部件进入我的项目。它使用自定义属性并且导致 Robolectric 崩溃。据我收集的信息,尚不支持自定义属性。注意:构造函数是“敌对的”,因为它在构造时抛出异常,但我现在已经将它们注释掉了。
崩溃日志
java.lang.RuntimeException:错误膨胀布局/主
在 com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:106)
在 com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:82)
在 com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:86)
在 com.xtremelabs.robolectric.res.ResourceLoader.inflateView(ResourceLoader.java:377)
在 com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate (ShadowLayoutInflater.java:43)
在 com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate (ShadowLayoutInflater.java:48)
在 android.view.LayoutInflater.inflate(LayoutInflater.java)
在 com.xtremelabs.robolectric.shadows.ShadowActivity.setContentView(ShadowActivity.java:101)
在 android.app.Activity.setContentView(Activity.java)
在 com.blah.MainActivity.onCreate(MainActivity.java:17)
在 com.blah.MainActivityTest.setUp(MainActivityTest.java:29)
在 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
在 org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
在 org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
引起原因:java.lang.ClassCastException:com.blah.support.shadows.ShadowMultiDirectionSlidingDrawer无法转换为com.xtremelabs.robolectric.shadows.ShadowView
在 com.xtremelabs.robolectric.Robolectric.shadowOf(Robolectric.java:857)
在 com.xtremelabs.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:70)
在 android.view.ViewGroup.addView(ViewGroup.java)
在 com.xtremelabs.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:60)
在 android.view.ViewGroup.addView(ViewGroup.java)
在 com.xtremelabs.robolectric.res.ViewLoader$ViewNode.addToParent(ViewLoader.java:217)
在 com.xtremelabs.robolectric.res.ViewLoader$ViewNode.create(ViewLoader.java:180)
在 com.xtremelabs.robolectric.res.ViewLoader$ViewNode.inflate(ViewLoader.java:150)
在 com.xtremelabs.robolectric.res.ViewLoader$ViewNode.inflate(ViewLoader.java:153)
在 com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:102)
... 29 更多
我正在尝试解决这个问题,因为我不太关心测试这个小部件。基本上我希望我的测试不会崩溃并验证视图元素是否出现在屏幕上。
有人建议将java文件放入android包中的技巧,但我不确定它是否适用于我的情况。正如这个答案所建议的,自定义小部件位于“android”包中,它与我的 com.blah 结构平行。
我创建了小部件的影子来解决敌意问题(但目前我只是注释掉抛出的异常)。最初,我想绕过构造函数中正在完成的工作,因为它依赖于 Robolectric 未正确报告的属性。影子构造函数正在被调用,但它会继续执行正常的构造函数。有没有办法绕过额外的建设?
影子类
@Implements (MultiDirectionSlidingDrawer.class)
public class ShadowMultiDirectionSlidingDrawer
{
public void __constructor__( Context context, AttributeSet attrs )
{
}
public void __constructor__( Context context, AttributeSet attrs, int defStyle )
{
}
}
自定义测试运行器
public class CustomTestRunner extends RobolectricTestRunner
{
public CustomTestRunner( Class<?> testClass ) throws InitializationError
{
super( testClass );
addClassOrPackageToInstrument("android");
}
@Override
protected void bindShadowClasses()
{
super.bindShadowClasses();
Robolectric.bindShadowClass( ShadowMultiDirectionSlidingDrawer.class );
}
}
在测试框架支持这一点之前,这是解决崩溃问题的正确方法吗?我是否对我的影子做错了什么,或者我错过了什么?