11
votes

I've created a test which extends GWTTestCase but I'm getting this error:

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 is in /src/test/java, while the GWT module is located in src/main/java. I assume this shouldn't be a problem.

I've done everything required according to http://mojo.codehaus.org/gwt-maven-plugin/user-guide/testing.html and of course that my gwt module already has com.google.gwt.core.Core indirectly imported.

<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>

Here is the test case, located in /src/test/java/com/myproject/test/ui

public class GwtTestMyFirstTestCase extends GWTTestCase {

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

    public void testSomething() {


    }

}

Here is the gwt module I'm trying to test, located in 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>

Can anyone give me a hint or two about what I'm doing wrong?

7
Without the POM contents etc. it's hard to guest what the problem...khmarbaise
Run tests in separate process See my answerAndrzej Jozwik

7 Answers

9
votes

To reproduce the solution used by KevinWong from the maven-gwt-plugin doc, which worked for me after losing over an hour trying the other solutions.

<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>
8
votes

I don't think the right thing to do is just to exclude the tests from your maven life cycle. What's the point of writen them? What you have to do is to properly configure the maven-surefire-plugin in order to make it work.

You see, that plugin uses a system classloader to look up the classes but GWTTestCase needs an URLClassLoader. That's the reason you are getting [WARN] No source path entries; expect subsequent failures. and the following ClassNotFoundException. No worries, though. It's easy to tell maven to use a URLClassLoader instead:

<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>

Please, notice the <userSystemClassLoader>false</useSystemClassLoader> entry. Also, notice that I added the sources of my tests and main directories in order to allow GWT find the needed classes to generate the Javascript. You might need to configure it differently.

5
votes

The problem was that the test was run by surefire instead of gwt-maven plugin. I had to explicitly exclude my gwt tests from surefire plugin:

<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> 

I still can't run my GWTTestCase tests, but that's another problem and subject for another question. I consider this issue solved.

3
votes

First exclude gwt testcases from 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>

Then configure 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>

Now you can easily run gwt testcases using gwt:test.

0
votes

I am very confident that this error has nothing to do with maven setup. My first guess would be that tests are not on gwt compile path... I guess the problematic source code is:

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

try changing to:

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

or whatever is the appropriate path.

0
votes

the solution to this

"[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')"  

GWT compilation error is to use "fork='true'" when invoking GWT compiler.

that's why the solutions posted here magically worked - they have "forkMode=always" and similar.

here's how I call GWT compiler:

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

and here's the full GWT compiler call in Gradle:

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