Я интегрирую пользовательский виджет в свой проект. Он использует пользовательские атрибуты и вызывает сбой 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 );
}
}
Является ли это правильным подходом для обхода сбоев, пока среда тестирования не поддерживает это? Я что-то не так делаю со своей тенью или что-то еще упускаю?