2011-06-27 40 views
6

Ja użyłem Fragment pakietu zgodności Androida, używając android-support-v4.jar. Ale nie mogę zrobić tego testu JUnit.Testowanie przy użyciu FragmentActivity Junit

Moim głównym FragmentActivity klasa jest zadeklarowana następująco

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

Wtedy w moim projekcie badania

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(){ 
     ................ 
    } 
} 

Ale gdy uruchamiam jako Android JUnit Test produkować FailedToCreateTests[Runner:Junit3]
Awaria śledzenia

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 

Kiedy zmienił się rozciąga ActivityMyActivityClass to działało dobrze (MyActivityClass extends Activity)
Me użył tego samego android-support-v4.jar w moim zarówno badania i głównego projektu

Odpowiedz

7

znalazłem rozwiązanie

Problem został

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

Nie można odnaleźć ścieżki klasy, mimo że odnoszą ten sam słoik w obu projektach (Próbowałem też za pomocą oddzielnego słoika zarówno dla projektu)

teraz tworzę środowisko testowe w samego projektu, to pracował

W moim 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> 

Potem dodałam moją klasę testów w moim specjalnym opakowaniu do testowania

extends ActivityInstrumentationTestCase2<fragmentActivity> 

Teraz wszystko działa bez zarzutu :)

+2

Pomaga to z powodzeniem, ale wciąż chcę wiedzieć, dlaczego tak się dzieje, gdy używa się oddzielnego projektu testowego ... – brk3

0

Domyślam się, że ActivityInstrumentationTestCase2 nie jest kompatybilny z Fragments. Powinieneś spróbować czegoś takiego jak Robolectric.

+0

Nie jest kompatybilny. Kiedy stworzyłem swoje testy w tym samym projekcie, zadziałało. Dzięki Marcarse za ten link. :) –

7

ActivityInstrumentationTestCase2 jest kompatybilny z Fragments. Powinieneś postępować tylko zgodnie z krokami wymienionymi w Android Testing: External libraries, które zostały zaktualizowane, aby uwzględnić przypadek android-support-v4.jar.

Następnie będzie można napisać testy takie jak ten:

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

lub cokolwiek trzeba przetestować.

+0

Dzięki Dtmilano, podany link jest naprawdę pomocny, ale dodałem ścieżkę budowania dla bibliotek zewnętrznych. Wciąż mam pecha. Kiedy stworzyłem swoje testy w tym samym projekcie, zadziałało :) –

+0

To, co opublikujesz, stanowi obejście problemu, które doprowadzi Cię do innego problemu: jak nie wysyłać testów za pomocą aplikacji. –

+0

Czy używasz Eclipse? Jestem pewien, że to działa, ponieważ go używam. –

1

Jest późno, ale mam ten sam problem rozwiązać przez tylko dodając do android-support-v4.jar zależność do głównego projektu i usunięcie go z projektu badawczego.

Następnie upewnij się, że główny projekt znajduje się na ścieżce budowania ścieżki projektu testowego:. Wykonaj to samo dla innych bibliotek głównych i projektów testowych mogą udostępniać.

0

Próbowałem prawie dzień do czynienia z tym problemem i znalazł rozwiązanie z innego post

Zasadniczo Android-support-v4.jar (w moim przypadku) jest stosowany we Wniosku powinny być samo co użyłeś w swojej aplikacji testowej. Najlepszym sposobem jest usunięcie tego samego słoika z katalogu libs twojego projektu testowego i wyeksportowanie go z projektu aplikacji. W ten sposób możesz na pewno pozbyć się tego problemu.

Powiązane problemy