我正在将a custom widget集成到我的项目中。它使用自定义属性并且正在崩溃Robolectric。从我收集的内容custom attributes aren't supported yet开始。注意:构造函数是“敌对的”,因为它会在构造时抛出异常,但我现在已将它们注释掉了。
崩溃日志
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更多
我正在努力解决这个问题,因为我不太关心测试这个小部件。基本上我希望我的测试不会崩溃并验证视图元素是否出现在屏幕上。
有人建议a hack of placing the java file in a android package,但我不确定它是否适用于我的情况。根据这个答案的建议,自定义小部件位于“android”包中,与我的com.blah结构平行。
我创建了一个小部件的阴影来解决敌意问题(但目前我只是注释掉异常抛出)。最初我想绕过构造函数中正在进行的工作,因为它依赖于Robolectric未正确报告的属性。阴影构造函数被调用,但它继续通过正常的构造函数执行。有没有办法绕过额外的建设?
ShadowClass
@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 );
}
}
这是解决崩溃的正确方法,直到测试框架支持这个吗?我的阴影有问题还是我错过了其他的东西?
答案 0 :(得分:4)
所以我用一种简单的方法解决了这个问题。我将其放在一个单独的布局文件中,而不是将视图作为main.xml的一部分进行膨胀。在我的Activity的构造函数中,我在受保护的函数中夸大了布局。在我的测试类中,我扩展了测试类,而不是膨胀视图元素,我使用布尔来跟踪函数的调用。
<强> MainActivity.java 强>
public class MainActivity extends FragmentActivity
{
@Override
public void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
setContentView( R.layout.main );
addOptionsShade();
}
protected void addOptionsShade()
{
ViewGroup viewGroup = (ViewGroup) findViewById( R.id.main_view );
View view = getLayoutInflater().inflate( R.layout.options_shade, null );
viewGroup.addView( view );
}
}
<强> MainActivityTest.java 强>
@Test
public void shouldHaveOptionsShade() throws Exception
{
assertTrue( mainActivity.hostileLibraryWasCalled );
}
class TestMainActivity extends MainActivity
{
boolean hostileLibraryWasCalled = false;
@Override
protected void addOptionsShade()
{
hostileLibraryWasCalled = true;
}
}
我删除了影子类&amp;绑定并将库放回一个合理的位置(不在android包中)。