Как создать теневой класс для устранения сбоев, связанных с пользовательскими атрибутами, при тестировании приложения Android с помощью Robolectric?

Я интегрирую пользовательский виджет в свой проект. Он использует пользовательские атрибуты и вызывает сбой Robolectric. Насколько я понимаю, пользовательские атрибуты пока не поддерживаются . Обратите внимание :, что конструктор является «враждебным», потому что он генерирует исключения при построении, но я пока закомментировал их.

Журнал сбоев

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

Я пытаюсь обойти эту проблему, потому что меня не слишком волнует тестирование этого виджета. В основном я хочу, чтобы мои тесты не падали и проверяли, что элемент представления появляется на экране.

Кто-то предложил хак с размещением java-файла в пакете Android , но я не уверен, применимо ли это в моем случае. Как следует из этого ответа, пользовательский виджет находится в пакете «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 );
    }
}

Является ли это правильным подходом для обхода сбоев, пока среда тестирования не поддерживает это? Я что-то не так делаю со своей тенью или что-то еще упускаю?

10
задан Community 23 May 2017 в 11:58
поделиться