2010-04-29 15 views
10

Ho creato un test che si estende GWTTestCase ma sto ottenendo questo errore:errore quando si esegue un GWTTestCase utilizzando Maven GWT plug

mvn integration-test gwt:test 
... 
Running com.myproject.test.ui.GwtTestMyFirstTestCase 
Translatable source found in...      
[WARN] No source path entries; expect subsequent failures 
[ERROR] Unable to find type 'java.lang.Object' 
[ERROR] Hint: Check that your module inherits 'com.google.gwt.core.Core' either directly or indirectly (most often by inheriting module 'com.google.gwt.user.User') 
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.1 sec <<< FAILURE! 

GwtTestMyFirstTestCase.java è in/src/test/java, mentre il Il modulo GWT si trova in src/main/java. Presumo che questo non dovrebbe essere un problema.

Ho eseguito tutto quanto richiesto in base allo http://mojo.codehaus.org/gwt-maven-plugin/user-guide/testing.html e ovviamente il mio modulo gwt ha già importato indirettamente com.google.gwt.core.Core.

<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.myproject</groupId> 
<artifactId>main</artifactId> 
<packaging>jar</packaging> 
<version>0.0.1-SNAPSHOT</version> 
<name>Main Module</name> 

<properties> 
    <gwt.module>com.myproject.MainModule</gwt.module> 
</properties> 

<parent> 
    <groupId>com.myproject</groupId> 
    <artifactId>app</artifactId> 
    <version>0.1.0-SNAPSHOT</version> 
</parent> 

<dependencies> 

    <dependency> 
     <groupId>com.myproject</groupId> 
     <artifactId>app-commons</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.gwt</groupId> 
     <artifactId>gwt-dev</artifactId> 
     <version>${gwt.version}</version> 
     <scope>provided</scope> 
    </dependency> 


</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-dependency-plugin</artifactId> 
      <configuration> 
       <outputFile>../app/src/main/webapp/WEB-INF/main.tree</outputFile> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>gwt-maven-plugin</artifactId> 


      <executions> 
        <execution> 
         <goals> 
          <goal>test</goal> 
         </goals> 
        </execution> 
      </executions> 

     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <classesDirectory> 
        ${project.build.directory}/${project.build.finalName}/${gwt.module} 
       </classesDirectory> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

</project> 

Qui è il banco di prova, che si trova in/src/test/java/com/myproject/test/ui

public class GwtTestMyFirstTestCase extends GWTTestCase { 

    @Override 
    public String getModuleName() { 
     return "com.myproject.MainModule"; 
    } 

    public void testSomething() { 


    } 

} 

Ecco il modulo di GWT che sto cercando di testare, con sede a src/main/java/com/myproject/MainModule.gwt.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.1/distro-source/core/src/gwt-module.dtd"> 
<module> 

    <inherits name='com.myproject.Commons' /> 

    <source path="site" /> 

    <source path="com.myproject.test.ui" /> 

    <set-property name="gwt.suppressNonStaticFinalFieldWarnings" value="true" /> 

    <entry-point class='com.myproject.site.SiteModuleEntry' /> 
</module> 

qualcuno può darmi un suggerimento o due su quello che sto facendo di sbagliato?

+0

Senza il contenuto POM, ecc è difficile ospite quale sia il problema ... – khmarbaise

+0

Eseguire test in un processo separato [Vedere la mia risposta] (http://stackoverflow.com/a/16194910/651140) –

risposta

5

Il problema era che il test era eseguito da surefire invece che da gwt-maven plugin. Ho dovuto escludere esplicitamente le mie prove GWT da plug infallibile:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 

      <configuration> 
       <excludes> 
        <exclude>**/*GwtTest*.java</exclude> 
        <exclude>**/*Gwt*Suite*.java</exclude> 
       </excludes> 
      </configuration> 
</plugin> 

Non riesco ancora a eseguire i miei test GWTTestCase, ma questo è un altro problema e oggetto di un'altra domanda. Considero questo problema risolto.

+0

PLease contrassegnare una risposta come corretta, in modo che le domande possano essere chiuse. –

+0

La risposta sotto di Joseph Must in realtà funziona per me. – Ajax

0

Sono molto fiducioso che questo errore non ha nulla a che fare con l'installazione di Maven. La mia prima risposta sarebbe che i test non sono in GWT compilare percorso ... Credo che il codice sorgente è problematico:

<source path="com.myproject.test.ui" /> 

provare a cambiare a:

<source path="com/myproject/test/ui" /> 

o qualsiasi altra cosa è il percorso appropriato.

6

Non credo che la cosa giusta da fare sia solo escludere i test dal ciclo di vita del vostro maven. Qual è il punto di averli scritti? Quello che devi fare è configurare correttamente il plugin maven-surefire per farlo funzionare.

Vedete, questo plugin utilizza un sistema di caricamento classe per cercare le classi ma GWTTestCase ha bisogno di un URLClassLoader. Questo è il motivo per cui stai ricevendo [WARN] No source path entries; expect subsequent failures. e il seguente ClassNotFoundException. Nessun problema, però. E 'facile dire Maven di utilizzare un'URLClassLoader invece:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
    <useSystemClassLoader>false</useSystemClassLoader> 
    <additionalClasspathElements> 
     <additionalClasspathElement>${basedir}/src/main/java</additionalClasspathElement> 
     <additionalClasspathElement>${basedir}/src/test/java</additionalClasspathElement> 
    </additionalClasspathElements> 
    </configuration> 
    <executions> 
    <execution> 
     <phase>integration-test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

prega, notare la voce <userSystemClassLoader>false</useSystemClassLoader>. Inoltre, si noti che ho aggiunto i sorgenti dei miei test e delle directory principali per consentire a GWT di trovare le classi necessarie per generare il Javascript. Potrebbe essere necessario configurarlo in modo diverso.

+0

Ho escluso il test clases dal plugin surefire perché non sto usando il plugin surefire per eseguire i miei test. Sto usando Maven Gwt Plugin per quello. Ho provato a usare surefire ad un certo punto ma senza successo. Forse proverò di nuovo ad usare surefire, ma per ora rimango con la mia attuale configurazione. Grazie comunque per la tua risposta. –

9

Per riprodurre la soluzione utilizzata da KevinWong dal maven-gwt-plugin doc, che ha funzionato per me dopo aver perso oltre un'ora a provare le altre soluzioni.

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <additionalClasspathElements> 
     <additionalClasspathElement>${project.build.sourceDirectory}</additionalClasspathElement> 
     <additionalClasspathElement>${project.build.testSourceDirectory}</additionalClasspathElement> 
     </additionalClasspathElements> 
     <useManifestOnlyJar>false</useManifestOnlyJar> 
     <forkMode>always</forkMode> 
     <systemProperties> 
     <property> 
      <name>gwt.args</name> 
      <value>-out \${webAppDirectory}</value> 
     </property> 
     </systemProperties> 
    </configuration> 
    </plugin> 
+0

non ho idea del perché, ma questo ha risolto i miei problemi. Molte grazie! – mirk

+0

Ecco perché è magico! Sono contento che ci abbia aiutato. –

+1

+1 anche per me. Questa risposta dovrebbe essere la soluzione accettata. – Ajax

3

Prima escludere casi di test GWT da maven-surefire-plugin:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.12.4</version> 
      <configuration> 
       <excludes> 
        <exclude>**/*GwtTest.java</exclude> 
       </excludes> 
      </configuration> 
     </plugin> 

Poi configurare gwt-maven-plugin:

  <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>gwt-maven-plugin</artifactId> 
      <version>2.5.0</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>test</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
            <includes>**/*GwtTest.java</includes> 
            <mode>htmlunit</mode> 
      </configuration> 
     </plugin> 

Ora si può facilmente eseguire GWT testcases utilizzando gwt:test.

+0

Questo ha funzionato per me. Ho entrambi i test unitari JUnit e Gwt e questo ha funzionato. – Faliorn

0

la soluzione a questo errore di compilazione GWT

"[ERROR] Unable to find type 'java.lang.Object' 
[ant:java]  [ERROR] Hint: Check that your module inherits 'com.google.gwt.core.Core' 
either directly or indirectly (most often by inheriting module 'com.google.gwt.user.User')" 

è usare "fork = 'true'" quando si richiama GWT compilatore.

ecco perché le soluzioni pubblicate qui funzionano magicamente - hanno "forkMode = always" e simili.

ecco come chiamo GWT compilatore:

ant.java(classname: 'com.google.gwt.dev.Compiler', failOnError: 'yes', maxmemory: '1000m', fork: 'true') 

e 'la completa chiamata GWT compilatore in Gradle qui:

war { 
    // Exclude unneccessery GWT Compiler artifacts 
    exclude "**/gwt-unitCache/**" 
} 

task widgetset << { 
    // Create widgetset directory (if needed) 
    def created = (new File(gwtBuildDir)).mkdirs() 

    // Compile 
    ant.java(classname: 'com.google.gwt.dev.Compiler', failOnError: 'yes', maxmemory: '1000m', fork: 'true') 
      { 
       classpath { 
        pathElement(path: configurations.compile.asPath) 
        pathElement(path: sourceSets.main.runtimeClasspath.asPath) 
        sourceSets.main.java.srcDirs.each { 
         pathelement(location: it.absolutePath) 
        } 
       } 

       arg(line: '-war ' + gwtBuildDir) 
       arg(line: '-logLevel INFO') 
       arg(line: '-style OBF') 
       arg(line: '-localWorkers 2') 
       arg(line: widgetsetClass) 

//    jvmarg(value: '-Djava.awt.headless=true') 
//    jvmarg(value: '-XX:MaxPermSize=256M') 
//    jvmarg(value: '-Xmx500M') 
      } 
} 


// Require widgetset compilation before WAR is built 
war.dependsOn widgetset 
Problemi correlati