2016-05-06 12 views
10

Mam projekt Android Studio z dwoma modułami bibliotecznymi: foo-module i bar-module. Każda implementuje bibliotekę, z foo-module definiującą interfejs strategii i w zależności od foo-module i wdrażającą taką strategię. foo-module ma testy oprzyrządowania (foo-module/src/androidTest/) do przetestowania kodu podstawowego, za pomocą strategii strategii stub, a bar-module powinien mieć własne testy oprzyrządowania.Jak dziedziczymy klasy testowe w modułach biblioteki Androida?

Zdefiniowałem klasę AbstractTests w foo-module/src/androidTest/, która wykonuje większość rzeczywistych testów. Mam również klasę StubTests w foo-module/src/androidTest/, która rozszerza AbstractTests i implementuje niezbędne metody abstract, aby zakończyć testowanie (zapewniając implementację strategii itp.). To wszystko działa świetnie.

W bar-module/src/androidTest/, stworzyłem BarStrategyTests klasy, zaprojektowany w celu odzwierciedlenia StubTests, ale zapewniają strategii realizowanych w bar-module. Jednak BarStrategyTests nie może zobaczyć AbstractTests, mimo że mam compile project(':foo-module') w moim pliku build.gradle, a główne (inne niż testowe) klasy w bar-module mogą działać poprawnie z głównymi (beztestowymi) klasami w foo-module. IOW, podczas gdy zależność project() obsługuje zwykły kod, nie obsługuje kodu androidTest/. Otrzymuję komunikat "error: package com.commonsware.foo.test nie istnieje".

Próbowałem również dodać androidTestCompile project(':foo-module'), z tym samym wynikiem.

Jaki jest przepis na dzielenie się testowym kodem testowym między modułami?

Tymczasowo mogę sklonować AbstractTests, ale to nie jest świetne długoterminowe rozwiązanie.

This SO question obejmuje podobne podłoże dla zwykłej Java. Czy ktoś próbował opcji w the one answer i dostał je do pracy na testy oprzyrządowania Androida? Pierwsza opcja (przeniesienie wspólnego kodu testowego do innego modułu jako zwykłego kodu niebędącego testem) wydaje się prawdopodobna, ale nie mam pojęcia, czy pozostałe dwa będą dobrze działać z wtyczką com.android.library, zamiast z wtyczką java.

+0

czy znalazłeś sposób, aby to osiągnąć? Chcę udostępnić moje klasy testowe także dla innych modułów, ale mam trudności z udostępnieniem zasobów. – karate

+1

@karate: Używam podejścia opisanego w zaakceptowanej odpowiedzi. – CommonsWare

Odpowiedz

8

Z uwagi na fakt, że wszystkie klasy testów (jednostka i oprzyrządowanie) nie są częścią żadnego modułu, w tym aar, nie są dostępne poprzez zależność od tego modułu. Zmierzyłem również ten problem i rozwiązałem go, tworząc test-module i umieszczając w nim wszystkie wymagane klasy (src/main/java). Tak więc w twoim przypadku możesz przenieść AbstractTests w tym module i używać tego modułu jako zależności zależnej od androidTestCompile.

+0

Zdecydowanie widzę potrzebę zrobienia czegoś innego, jeśli zależałbym od pakowanego AAR, takiego jak artefakt repozytorium. Spodziewałem się, że 'compile project (': foo-module')' dopasuje odpowiednie zestawy źródeł - w końcu nie jest to 'compile projectButJustTheMainSourcesetPlease (': foo-module')'. :-) Mam zamiar zostawić to otwarte przez jakiś czas, aby sprawdzić, czy ktoś inny ma inną opcję, ale nie będę zszokowany, jeśli twój koniec będzie najlepszą opcją. Dzięki za pomoc! – CommonsWare

+1

Należy zauważyć, że takie podejście wymaga wielu dodatkowych modułów. Zasadniczo, 'foo-module' nie może mieć własnych testów.Nie tylko 'AbstractTests' musi zostać przeniesiony do' foo-module-test-common', ale wszelkie testy poprzednio w 'foo-module' muszą zostać przeniesione do' foo-module-test'. W przeciwnym razie otrzymasz okrężne zależności: 'foo-module' ma' androidTestCompile' na 'foo-module-test-common', który ma' compile' na 'foo-module'. 'foo-moduł' nie może w rezultacie polegać na' foo-module-test-common'. Co za ból. – CommonsWare

+2

Cóż, musisz unikać 'foo-module' zależy od' foo-module-test-common'. Jedną z opcji jest przeniesienie wszystkich testów z 'foo-module' na' foo-module-test-common', więc ten moduł nie tylko zawiera popularne klasy testowe w 'src/main/java' ale zawiera również testy dla' foo -module' w 'src/androidTest/java'. –

Powiązane problemy