FragmentActivity Junit Testing - PullRequest
6 голосов
/ 27 июня 2011

Я использовал Fragment пакета обеспечения совместимости Android, используя android-support-v4.jar.Но я не могу пройти тест JUnit по этому вопросу.

Мой основной FragmentActivity класс объявлен следующим образом

public class MyActivityClass extends FragmentActivity{
...............
}

Затем в моем тестовом проекте

public class MyActivityClassTest extends ActivityInstrumentationTestCase2<MyActivityClass> {
    public MyActivityClassTest() {  
        super("com.android.myproject", MyActivityClass.class);
    }
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        ...................
    }

    public void testPreconditions() {
        .................
    }
    public void testNotNull(){
        ................
    }
}

Но когда я запускаю как Android JUnit Test, производим FailedToCreateTests[Runner:Junit3]
Failure Trace

java.lang.RuntimeException: Exception during suite construction
at android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:239)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
Caused by: java.lang.reflect.InvocationTargetException
at com.android.myproject.test.MyActivityClassTest.<init>(MyActivityClassTest.java:28)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
at android.test.suitebuilder.TestMethod.instantiateTest(TestMethod.java:87)
at android.test.suitebuilder.TestMethod.createTest(TestMethod.java:73)
at android.test.suitebuilder.TestSuiteBuilder.addTest(TestSuiteBuilder.java:263)
at android.test.suitebuilder.TestSuiteBuilder.build(TestSuiteBuilder.java:185)
at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:336)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3982)
at android.app.ActivityThread.access$2900(ActivityThread.java:119)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1901)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4363)
at java.lang.reflect.Method.invokeNative(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoClassDefFoundError: com.android.myproject.MyActivityClass
... 19 more

Когда я изменил MyActivityClass на удлинители Activity он работал нормально (MyActivityClass extends Activity)
Я использовал то же самое android-support-v4.jar вмой тестовый и основной проект

Ответы [ 6 ]

7 голосов
/ 28 июня 2011

Я нашел решение

Проблема была

Caused by: java.lang.NoClassDefFoundError: com.android.myproject.MyActivityClass

Он не может найти путь к классу, даже если я ссылаюсь на один и тот же jar в обоих проектах (я также пытался использовать отдельный jar для обоих проектов)

Теперь я создал свою среду тестирования в том же проекте , тогда она работала

По моему AndroidManifest.xml

<manifest...>
    <!-- For doing JUnit test, Instrumentation Start (remove later) -->
    <instrumentation
        android:targetPackage="com.pe.android.isccasinos"
        android:name="android.test.InstrumentationTestRunner" />
    <!-- For doing JUnit test, Instrumentation End (remove later) -->   
    <application ...>
    ................
    <!-- For doing JUnit test, add library starting (remove later) -->
        <uses-library
            android:name="android.test.runner" />
        <!-- For doing JUnit test, add library ending (remove later) -->
    </application>
<manifest>

Затем я добавил класс тестирования в свой специальный пакет для тестирования

extends ActivityInstrumentationTestCase2<fragmentActivity>

Теперь все работает нормально :)

7 голосов
/ 28 июня 2011

ActivityInstrumentationTestCase2 совместим с Fragments. Вам следует выполнять только шаги, упомянутые в Тестирование Android: внешние библиотеки , которое было обновлено и теперь распространяется на случай android-support-v4.jar.

Затем вы сможете написать такие тесты:

public void testFragmentManager() {
    FragmentActivity activity = getActivity();
    assertNotNull(activity.getSupportFragmentManager());
}

или что вам нужно проверить.

1 голос
/ 23 ноября 2013

Это поздно, но я решаю ту же проблему с помощью only , добавив зависимость android-support-v4.jar к основному проекту и удалив ее из тестового проекта.

Затем убедитесь, что основной проект находится на пути сборки тестового проекта. Сделайте то же самое для любых других библиотек main, и тестовые проекты могут совместно использовать.

1 голос
/ 09 февраля 2012

См. Этот вопрос для лучшего ответа:

FragmentActivity не может быть проверена с помощью ActivityInstrumentationTestCase2

Вам необходимо экспортировать ссылку на библиотеку совместимости из своего приложения.

0 голосов
/ 27 ноября 2013

Я почти день пытался решить эту проблему и нашел решение из другого поста

В основном ваш android-support-v4.jar (в моем случае) используется вПриложение должно совпадать с тем, что вы использовали в тестовом приложении.Лучший способ сделать это - удалить тот же самый jar из каталога libs вашего тестового проекта и экспортировать тот же самый из вашего проекта Application.Таким образом, вы можете избавиться от этой проблемы наверняка.

0 голосов
/ 27 июня 2011

Я предполагаю, что ActivityInstrumentationTestCase2 не совместим с Fragments. Вы должны попробовать что-то вроде Robolectric .

...