2014-11-20 6 views
10

W tej chwili mam bibliotekę Java, która ma klasę testową. W tej klasie chcę uzyskać dostęp do niektórych plików znajdujących się na moim dysku twardym.Plik dostępu w teście JUnit w środowisku Gradle

build.gradle wygląda następująco:

apply plugin: 'java' 

dependencies { 
    testCompile 'junit:junit:4.11' 
} 

Mój plik jest pod java_lib/src/test/assets/file.xml i klasy Java jest pod java_lib/src/test/java/<package_name>.java

Dlatego wykonać

final InputStream resourceAsStream = this.getClass().getResourceAsStream("assets/file.xml");

Niestety otrzymuję null z powrotem. Co ja robię źle?

Odpowiedz

13

Aby dostać rzeczy toczenia należy dodać następujące do pliku Gradle:

task copyTestResources(type: Copy) { 
    from "${projectDir}/src/test/resources" 
    into "${buildDir}/classes/test" 
} 
processTestResources.dependsOn copyTestResources 

Co to w zasadzie nie kopiuje wszystkie pliki w katalogu src/test/resource do build/classes/test, ponieważ this.getClass().getClassLoader().getResourceAsStream(".") punkty build/classes/test.

issue jest już znana Google i chcą go naprawić w Android Studio 1.2 (ponieważ trzeba IntelliJ14 na to i wydaje się, że zostanie ona uwzględniona w Android Studio 1.2)

+0

Wygląda na to, że wciąż nie jest naprawiony w wersji 1.4 ... –

+0

@RodrigoQuesada może być, nadal używam tego fragmentu, ponieważ nie chcę polegać na tym "może być naprawiony", a następnie z następną wersją nie działa ponownie – Niklas

+2

Otrzymuję komunikat "Nie można odnaleźć właściwości" processTestResources "w projekcie". – ReDetection

5

Spróbuj umieścić file.xml pod src/test/resources i używać this.getClass().getResourceAsStream("file.xml") (bez prefiksu folderu)

Problem pojawia się, że folder assets nie jest częścią ścieżki klasy Test wykonawczego, stąd this.getClass().getResourceAsStream("assets/file.xml") nie byłby w stanie rozwiązać ścieżkę zgodnie z oczekiwaniami.

Domyślnie folder zasobów testowych w projekcie Gradle java to src/test/resources (taki sam jak projekt Java Maven). Można zastąpić go assets folderze, jeśli chcesz, dodając to w projekcie za build.gradle pliku:

sourceSets.test { 
    resources.srcDirs = ["src/test/assets"] 
} 
+2

Nie działa dla mnie. Nadal dostaję null z 'getResourceAsStream' – Niklas

+0

działa idealnie! Dzięki –

2

W build.gradle, dodać to:

sourceSets.test { 
    resources.srcDirs = ["src/test"] 
} 

W kodzie, dostęp do zasobów tak:

getClass().getClassLoader().getResourceAsStream("assets/file.xml")); 

Działa u mnie.

+0

Wypróbuję to później dzisiaj lub jutro – Niklas

+0

'this.getClass(). GetClassLoader(). GetResource (". ");' Zwraca '// build/classes/test /'. Więc to nie działa dla mnie. – Niklas

+0

Ale czy folder nie jest obecny w tym folderze? – ToYonos

0

Dzięki za wskazanie Google issue Cały dzień szukam tego ...

W "Android Studio 1.1 RC 1" (narzędzie do tworzenia gradle 1.1.0-rc1) nie ma potrzeby dodawania pracy do pliku gradle, ale musisz wykonać test z menu zadań gradle (lub wiersza poleceń)!

Powiązane problemy