2011-02-09 12 views
24

W moich testach jednostkowych chcę utworzyć katalog tmp wewnątrz $ {project.build.directory}. Jak mogę uzyskać dostęp do wartości $ {project.build.directory} w moim teście jednostki?

Jednym ze sposobów, o których mogłem pomyśleć, jest dostarczenie przefiltrowanego pliku właściwości w zasobach testowych, które przechowują tę wartość. (Nie próbowałem jeszcze, ale myślę, że to powinno działać.)

Czy istnieje bezpośredni sposób dostępu/przekazania tej wartości nieruchomości?

Pozdrawiam, Florian

+0

Prawdopodobnie moglibyśmy skonfigurować, aby ustawić właściwość systemu, ale jakoś nie podoba mi się pomysł przekazywania rzeczy za pośrednictwem właściwości systemu. Z drugiej strony można powiedzieć, że jest to specyficzne dla środowiska (przynajmniej ścieżka bezwzględna). Co myślisz? – Puce

Odpowiedz

5

Pamiętaj, że Twoje testy jednostkowe nie muszą być wykonane z Maven Surefire plug-in, więc ${project.build.directory} nieruchomość może nie być dostępny. Aby twoje testy były bardziej przenośne, wolałbym polecać używanie File.createTempFile().

+2

Cóż, właściwie to właśnie robimy i chcę to zmienić. Mieliśmy problem z zapełnieniem katalogu tmp na Hudson, dopóki nie zabrakło miejsca na dysku. Badamy kilka opcji, jedną jest przekazanie katalogu tmp do katalogu docelowego jako argumentu do File.createTempFile(). W ten sposób "mvn clean" oczyści wszystko. – Puce

+0

Poza tym, ponieważ jest to projekt Maven, myślę, że testy będą działać tylko przy użyciu programu MAven lub IDE, który obsługuje Maven (tutaj: Eclipse). – Puce

12

Myślę, że korzystanie z właściwości systemu jest dość proste, jeśli skonfigurujesz plugin murfire zgodnie z wyjaśnieniem tutaj http://maven.apache.org/plugins/maven-surefire-plugin/examples/system-properties.html. Nawet przykład odpowiada bezpośrednio na twoje pytanie:

<project> 
    [...] 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.9</version> 
     <configuration> 
      <systemPropertyVariables> 
      <propertyName>propertyValue</propertyName> 
      <buildDirectory>${project.build.directory}</buildDirectory> 
      [...] 
      </systemPropertyVariables> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    [...] 
</project> 
14

Użyłem czegoś takiego z pewnym sukcesem wcześniej. Test jednostkowy nadal będzie działał, nawet jeśli nie korzystamy z Mavena, katalog docelowy będzie nadal tworzony dwa bloki w porównaniu z cwd, gdziekolwiek testy będą uruchamiane.

public File targetDir(){ 
    String relPath = getClass().getProtectionDomain().getCodeSource().getLocation().getFile(); 
    File targetDir = new File(relPath+"../../target"); 
    if(!targetDir.exists()) { 
    targetDir.mkdir(); 
    } 
    return targetDir; 
} 
+1

Świetnie, że działa dla mnie w maven i eclipse. –

+0

Nieco spóźniony na dyskusję, ale nie "relPath" jest równy 'src/main/java', więc na pewno musisz rozwiązać ten cel za pomocą' ../../../ target'? – Adam

Powiązane problemy