2012-12-05 17 views
12

Przez jakiś czas waliłem głową w ścianę, próbując zdobyć maven, robolectric, actionbar sherlock i intellij, aby wszyscy grali ładnie. Zrezygnowałem z budowania z intellij na teraz i koncentruję się na maven.Jak zintegrować Robolectric, Maven, ActionBarSherlock (a najlepiej + IntelliJ) z projektem Android?

Mam aplikację z paskiem akcji, gdy pomijam testy w budowaniu maven (co mówi mi, że jestem dobry, aby przejść na front integracji ActionBar). Kompilacja IntelliJ kończy się niepowodzeniem w ManifestParsingTest.java narzekając, że nie wie, gdzie znajduje się junit (między innymi).

integracja Robolectric

miałem już Robolectric działa z powodzeniem w projekcie. Skopiowane pliki z Jake Wharton's gist do src/test/java/com/blah/blah/support/ (z wyjątkiem ShadowSherlockFragmentActivity.java który mieszka w src/test/java/com/blah/blah/support/shadows/) i umieścić ten wiersz w konstruktorze dla mojego niestandardowego testowym androidów (życie w support katalog):

ActionBarSherlock.registerImplementation(ActionBarSherlockRobolectric.class); 

błędy mvn

Występują w tych błędach kompilacji (IntelliJ ma również czerwone zawijasy dla tych samych rzeczy):

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:testCompile (default-testCompile) on project Blah: Compilation failure: Compilation failure: 
[ERROR] /Users/clatislaw/Documents/Code/Android/projectName/src/test/java/com/blah/blah/support/SherlockResourceLoader.java:[29,9] cannot find symbol 
[ERROR] symbol : constructor ResourceLoader(int,java.lang.Class,java.util.List<java.io.File>,java.io.File) 
[ERROR] location: class com.xtremelabs.robolectric.res.ResourceLoader 
[ERROR] /Users/clatislaw/Documents/Code/Android/projectName/src/test/java/com/blah/blah/support/SherlockResourceLoader.java:[45,5] method does not override or implement a method from a supertype 
[ERROR] /Users/clatislaw/Documents/Code/Android/projectName/src/test/java/com/blah/blah/support/ActionBarSherlockTestRunner.java:[39,37] resourceLoaderForRootAndDirectory has private access in com.xtremelabs.robolectric.RobolectricTestRunner 
[ERROR] /Users/clatislaw/Documents/Code/Android/projectName/src/test/java/com/blah/blah/support/ActionBarSherlockTestRunner.java:[47,30] cannot find symbol 
[ERROR] symbol : method getResourcePath() 
[ERROR] location: class com.xtremelabs.robolectric.RobolectricConfig 
[ERROR] /Users/clatislaw/Documents/Code/Android/projectName/src/test/java/com/blah/blah/support/ActionBarSherlockTestRunner.java:[48,9] resourceLoaderForRootAndDirectory has private access in com.xtremelabs.robolectric.RobolectricTestRunner 
[ERROR] /Users/clatislaw/Documents/Code/Android/projectName/src/test/java/com/blah/blah/support/ActionBarSherlockTestRunner.java:[38,3] method does not override or implement a method from a supertype 

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.blah.blah</groupId> 
    <artifactId>projectName</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>apk</packaging> 
    <name>Project Name App</name> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>4.0.1.2</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.pivotallabs</groupId> 
      <artifactId>robolectric</artifactId> 
      <version>1.1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>support-v4</artifactId> 
      <version>r6</version> 
     </dependency> 

     <dependency> 
      <groupId>com.actionbarsherlock</groupId> 
      <artifactId>library</artifactId> 
      <version>4.1.0</version> 
      <type>apklib</type> 
     </dependency> 
    <build> 
     <finalName>${project.artifactId}</finalName> 

     <plugins> 
      <plugin> 
       <!-- See http://code.google.com/p/maven-android-plugin/ --> 
       <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
       <artifactId>android-maven-plugin</artifactId> 
       <version>3.2.0</version> 
       <configuration> 
        <sdk> 
         <platform>15</platform> 
        </sdk> 
       </configuration> 
       <extensions>true</extensions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Czy istnieje jakiś config projekt mi brakuje?

+0

Czy masz ten sam błąd z wersją 1,2-migawkę robolectric? – redwoolf

+0

@redwoolf: Ustawienie wersji na 1.2-SNAPSHOT w POM spowodowało ten błąd: "POM dla com.pivotallabs: robolectric: jar: 1.2-SNAPSHOT brakuje, brak informacji o zależnościach." Czy istnieje inny sposób, w jaki mogę uzyskać migawkę? – colabug

+0

Tak, musisz dodać repozytorium migawki do swojej pom lub w ustawieniach. zobacz http://stackoverflow.com/a/7717234/112263 – redwoolf

Odpowiedz

10

Na placu, aby wesprzeć ten przypadek użycia używamy a modified version of Robolectric. Współpracujemy z firmą Pivotal, aby zmusić nas do korzystania z widelca i niezbędnych zmian w głównym repozytorium. Wymagane zmiany są hakami do systemu ładowania zasobów. Te metody są obecnie prywatne, co jest przyczyną błędów kompilacji, które widzisz.

Pivotal nie wydaje często wydań w jakikolwiek sposób, więc jeśli zmiany zostaną wprowadzone na wyższy poziom, najprawdopodobniej będziesz musiał używać wersji SNAPSHOT przez jakiś czas.

+0

Dzięki za szybką odpowiedź! Wygląda na to, że moje opcje to użycie gałęzi kwadratowej zamiast linii głównej lub ręczne łatanie lokalnie rozwidlonej wersji głównej linii Robolectric. – colabug

+1

właśnie powiedziano nam, że są teraz 99,9% zsynchronizowane z upstream Robolectric i powinien być w stanie przełączyć się do ich wersji (the 'oddziału master') w następnym tygodniu lub dwóch. Miejmy nadzieję, że uda nam się je przycisnąć, aby wydać nowe wydanie, gdy tylko zostanie ukończone. –

+0

@JakeWharton używasz Eclipse lub IntelliJ jako ide? Pytam was, ponieważ wersja 4.2.0 ma pewne problemy związane z biblioteką wsparcia w Eclipse. Jest on zawarty zarówno w folderze pom i libs, jak i dwukrotnie pomijany przez Eclipse. – Snicolas

2

Mogę sprawić, żeby działało.

Spróbuj tego:

  • ruch robolectric i junit zależności do końca.

  • wskazuje src i ścieżkę testową w tagu budowy, po nazwie ostatecznej i przed wtyczkami.

  • Przebuduj i uruchom test z paska narzędzi.

    <dependencies> 
    <dependency> 
        <groupId>com.google.android</groupId> 
        <artifactId>android</artifactId> 
        <version>4.0.1.2</version> 
        <scope>provided</scope> 
    </dependency> 
    
    <dependency> 
        <groupId>com.google.android</groupId> 
        <artifactId>support-v4</artifactId> 
        <version>r6</version> 
    </dependency> 
    
    <dependency> 
        <groupId>org.roboguice</groupId> 
        <artifactId>roboguice</artifactId> 
        <version>2.0</version> 
    </dependency> 
    
    <dependency> 
        <groupId>com.octo.android.robospice</groupId> 
        <artifactId>robospice-spring-android</artifactId> 
        <version>1.2.0</version> 
    </dependency> 
    
    <dependency> 
        <groupId>org.codehaus.jackson</groupId> 
        <artifactId>jackson-mapper-asl</artifactId> 
        <version>1.9.9</version> 
    </dependency> 
    
    <dependency> 
        <groupId>com.google.code.gson</groupId> 
        <artifactId>gson</artifactId> 
        <version>2.2.2</version> 
    </dependency> 
    
    <dependency> 
        <groupId>com.actionbarsherlock</groupId> 
        <artifactId>actionbarsherlock</artifactId> 
        <version>4.2.0</version> 
        <type>apklib</type> 
    </dependency> 
    
    <dependency> 
        <groupId>com.actionbarsherlock</groupId> 
        <artifactId>actionbarsherlock</artifactId> 
        <version>4.2.0</version> 
    </dependency> 
    
    <dependency> 
        <groupId>com.pivotallabs</groupId> 
        <artifactId>robolectric</artifactId> 
        <version>1.1</version> 
        <scope>test</scope> 
    </dependency> 
    
    <dependency> 
        <groupId>junit</groupId> 
        <artifactId>junit</artifactId> 
        <version>4.8.2</version> 
        <scope>test</scope> 
    </dependency> 
    
    </dependencies> 
    
    <build> 
    <finalName>${project.artifactId}</finalName> 
    
    <sourceDirectory>src</sourceDirectory> 
    <testSourceDirectory>test</testSourceDirectory> 
    
    <plugins> 
        <plugin> 
         <!-- See http://code.google.com/p/maven-android-plugin/ --> 
         <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
         <artifactId>android-maven-plugin</artifactId> 
         <version>3.2.0</version> 
         <configuration> 
          <sdk> 
           <platform>15</platform> 
          </sdk> 
         </configuration> 
         <extensions>true</extensions> 
        </plugin> 
    </plugins> 
    </build> 
    
Powiązane problemy