Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GWT testing error NoClassDefFoundError: com/google/gwt/dev/cfg/Condition

Tags:

testing

gwt

Maybe someone can help me, I'm trying to write my first gwt unit test, but here's the problem, when I run my test with maven I get this error:

>  java.lang.NoClassDefFoundError: com/google/gwt/dev/cfg/Condition     at
> com.google.gwt.junit.client.GWTTestCase.createStrategy(GWTTestCase.java:340)
>   at
> com.google.gwt.junit.client.GWTTestCase.getStrategy(GWTTestCase.java:257)
>   at
> com.google.gwt.junit.client.GWTTestCase.getSyntheticModuleName(GWTTestCase.java:275)
>   at
> com.google.gwt.junit.client.GWTTestCase.setName(GWTTestCase.java:321)
>   at junit.framework.TestSuite.createTest(TestSuite.java:63)  at
> junit.framework.TestSuite.addTestMethod(TestSuite.java:283)   at
> junit.framework.TestSuite.<init>(TestSuite.java:146)    at
> org.junit.internal.runners.JUnit38ClassRunner.<init>(JUnit38ClassRunner.java:71)
>   at
> org.junit.internal.builders.JUnit3Builder.runnerForClass(JUnit3Builder.java:14)
>   at
> org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
>   at
> org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
>   at
> org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
>   at
> org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
>   at
> org.apache.maven.surefire.junit4.JUnit4TestSet.<init>(JUnit4TestSet.java:45)
>   at
> org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite.createTestSet(JUnit4DirectoryTestSuite.java:56)
>   at
> org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:96)
>   at
> org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:209)
>   at org.apache.maven.surefire.Surefire.run(Surefire.java:156)    at
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>   at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.lang.reflect.Method.invoke(Method.java:601)     at
> org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
>   at
> org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)
> Caused by: java.lang.ClassNotFoundException:
> com.google.gwt.dev.cfg.Condition  at
> java.net.URLClassLoader$1.run(URLClassLoader.java:366)    at
> java.net.URLClassLoader$1.run(URLClassLoader.java:355)    at
> java.security.AccessController.doPrivileged(Native Method)    at
> java.net.URLClassLoader.findClass(URLClassLoader.java:354)    at
> java.lang.ClassLoader.loadClass(ClassLoader.java:423)     at
> sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)     at
> java.lang.ClassLoader.loadClass(ClassLoader.java:356)

Here's my testCase:

public class TelekanalServiceImplTest extends GWTTestCase {

    @Override
    public String getModuleName() {
        // TODO Auto-generated method stub
        return "com.karq.tvkava.tvkavaJUnit";
    }



    public void testTelekanalService(){
        // Create the service that we will test.
        TelekanalServiceAsync telekanalService = GWT.create(TelekanalService.class);
        ServiceDefTarget target = (ServiceDefTarget) telekanalService;
        target.setServiceEntryPoint(GWT.getModuleBaseURL() + "tvkava/telekanalService");

        // Since RPC calls are asynchronous, we will need to wait for a response
        // after this test method returns. This line tells the test runner to wait
        // up to 10 seconds before timing out.
        delayTestFinish(10000);
        //Test data
        Telekanal telekanal = new Telekanal();
        telekanal.setNimetus("test");
        telekanal.setKirjeldus("see on test");
        // Send a request to the server.
        telekanalService.saveOrUpdateTelekanal(telekanal, new AsyncCallback<Void>() {
          public void onFailure(Throwable caught) {
            // The request resulted in an unexpected error.
            fail("Request failure: " + caught.getMessage());
          }

          public void onSuccess(Void result) {
            // Verify that the response is correct.
            boolean isSaved = true;
            assertTrue(isSaved);
            // Now that we have received a response, we need to tell the test runner
            // that the test is complete. You must call finishTest() after an
            // asynchronous test finishes successfully, or the test will time out.
            finishTest();
          }
        });
    }

}

And in com.karq.tvkava I have module file called tvKavaJUnit.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<module>
  <!-- Inherit our applications main module.                      -->
  <inherits name='com.karq.tvkava.tvkava'/>

  <!-- Specify the path to any remote services.                   -->
  <servlet path="/tvkava/telekanalService" class="com.karq.tvkava.server.services.TelekanalServiceImpl" />

</module>

And ofcourse I have the main module in com.karq.tvkava and its called tvkava.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='tvkava'>
  <!-- Inherit the core Web Toolkit stuff.                        -->
  <inherits name='com.google.gwt.user.User'/>

  <!-- Inherit the default GWT style sheet.  You can change       -->
  <!-- the theme of your GWT application by uncommenting          -->
  <!-- any one of the following lines.                            -->
  <inherits name='com.google.gwt.user.theme.standard.Standard'/>
  <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
  <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->

  <!-- Other module inherits                                      -->
<inherits name='net.sf.gilead.Gilead4Gwt'/>
<source path='client/service' />
  <source path='shared'/>
  <!-- Specify the app entry point class.                         -->
  <entry-point class='com.karq.tvkava.client.tvkava'/>

  <!-- Specify the paths for translatable code                    -->
  <source path='client'/>
  <source path='shared'/>

</module>
like image 394
karq Avatar asked Aug 04 '11 16:08

karq


4 Answers

I managed to get Surefire to work seamlessly with my GWT tests, outputting the proper results and failing the build when there are test failures. In my POM, I've got Surefire set up like so:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
    <configuration>
        <additionalClasspathElements>
            <additionalClasspathElement>${project.build.sourceDirectory}</additionalClasspathElement>
            <additionalClasspathElement>${project.build.testSourceDirectory}</additionalClasspathElement>
        </additionalClasspathElements>
        <useSystemClassLoader>true</useSystemClassLoader>
        <useManifestOnlyJar>false</useManifestOnlyJar>
        <forkMode>always</forkMode>
        <systemProperties>
            <property>
                <name>gwt.args</name>
                <value>-out www-test</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>

You'll need to define the variables project.build.sourceDirectory and project.build.testSourceDirectory. For me they're something like <project-name>/src/main/java and <project-name>/src/test/java.

I also had to add in a dependency on gwt-dev:

<dependency>
    <groupId>com.google.gwt</groupId>
    <artifactId>gwt-dev</artifactId>
    <version>2.4.0</version>
    <scope>provided</scope>
</dependency>
like image 78
Chris Cashwell Avatar answered Nov 10 '22 00:11

Chris Cashwell


I had the same exact stack trace and adding

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

fixed it.

like image 38
Christian Achilli Avatar answered Nov 10 '22 01:11

Christian Achilli


Do you have both gwt-user.jar and gwt-dev.jar on the classpath?

like image 4
BobV Avatar answered Nov 10 '22 01:11

BobV


You'll get this error message if you've had SureFire run a GWTTest as a JUnit test. Since SureFire does not know what to do with GWT code, you'll get this error.

It's best to tell SureFire to ignore all the tests with a given pattern. I name all my GWT tests "SomethingGwtTest.java." This way SureFire ignores them and the GWT test runner from the gwt-maven-plugin picks them up and runs them properly.

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <excludes>
            <exclude>**/*GwtTest.java</exclude>
        </excludes>
    </configuration>
</plugin
like image 1
Joseph Lust Avatar answered Nov 09 '22 23:11

Joseph Lust