在使用Robolectric测试Android应用程序时,如何创建影子类以解决与自定义属性相关的崩溃问题?

在使用Robolectric测试Android应用程序时,如何创建影子类以解决与自定义属性相关的崩溃问题?,第1张

概述我正在将acustomwidget集成到我的项目中.它使用自定义属性并且正在崩溃Robolectric.从我收集到的内容,customattributesaren’tsupportedyet.注意:构造函数是“敌对的”,因为它会在构造上抛出异常,但我现在已将它们注释掉了.崩溃日志java.lang.RuntimeException:errorin

我正在将a custom widget集成到我的项目中.它使用自定义属性并且正在崩溃Robolectric.从我收集到的内容,custom attributes aren’t supported yet.注意:构造函数是“敌对的”,因为它会在构造上抛出异常,但我现在已将它们注释掉了.

崩溃日志

java.lang.RuntimeException: error inflating layout/main
at com.xtremelabs.robolectric.res.VIEwLoader.inflateVIEw(VIEwLoader.java:106)
at com.xtremelabs.robolectric.res.VIEwLoader.inflateVIEw(VIEwLoader.java:82)
at com.xtremelabs.robolectric.res.VIEwLoader.inflateVIEw(VIEwLoader.java:86)
at com.xtremelabs.robolectric.res.ResourceLoader.inflateVIEw(ResourceLoader.java:377)
at com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:43)
at com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:48)
at androID.vIEw.LayoutInflater.inflate(LayoutInflater.java)
at com.xtremelabs.robolectric.shadows.ShadowActivity.setContentVIEw(ShadowActivity.java:101)
at androID.app.Activity.setContentVIEw(Activity.java)
at com.blah.MainActivity.onCreate(MainActivity.java:17)
at com.blah.MainActivityTest.setUp(MainActivityTest.java:29)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)

Caused by: java.lang.classCastException: com.blah.support.shadows.ShadowMultIDirectionSlIDingDrawer cannot be cast to com.xtremelabs.robolectric.shadows.ShadowVIEw
at com.xtremelabs.robolectric.Robolectric.shadowOf(Robolectric.java:857)
at com.xtremelabs.robolectric.shadows.ShadowVIEwGroup.addVIEw(ShadowVIEwGroup.java:70)
at androID.vIEw.VIEwGroup.addVIEw(VIEwGroup.java)
at com.xtremelabs.robolectric.shadows.ShadowVIEwGroup.addVIEw(ShadowVIEwGroup.java:60)
at androID.vIEw.VIEwGroup.addVIEw(VIEwGroup.java)
at com.xtremelabs.robolectric.res.VIEwLoader$VIEwNode.addtoparent(VIEwLoader.java:217)
at com.xtremelabs.robolectric.res.VIEwLoader$VIEwNode.create(VIEwLoader.java:180)
at com.xtremelabs.robolectric.res.VIEwLoader$VIEwNode.inflate(VIEwLoader.java:150)
at com.xtremelabs.robolectric.res.VIEwLoader$VIEwNode.inflate(VIEwLoader.java:153)
at com.xtremelabs.robolectric.res.VIEwLoader.inflateVIEw(VIEwLoader.java:102)
… 29 more

我正在努力解决这个问题,因为我不太关心测试这个小部件.基本上我希望我的测试不会崩溃并验证视图元素是否出现在屏幕上.

有人建议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 );    }}

在测试框架支持此问题之前,这是解决崩溃的正确方法吗?我的阴影做错了还是我错过了别的什么?

解决方法:

所以我解决了这个问题.我将其放在一个单独的布局文件中,而不是将视图作为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

@Testpublic voID shouldHaveOptionsShade() throws Exception{    assertTrue( mainActivity.hostilelibraryWasCalled );}class TestMainActivity extends MainActivity{    boolean hostilelibraryWasCalled = false;    @OverrIDe    protected voID addOptionsShade()    {        hostilelibraryWasCalled = true;    }}

我删除了影子类&绑定并将库放回一个合理的位置(不在androID包中).

总结

以上是内存溢出为你收集整理的在使用Robolectric测试Android应用程序时,如何创建影子类以解决与自定义属性相关的崩溃问题?全部内容,希望文章能够帮你解决在使用Robolectric测试Android应用程序时,如何创建影子类以解决与自定义属性相关的崩溃问题?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1097905.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存