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>
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>
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.
Do you have both gwt-user.jar
and gwt-dev.jar
on the classpath?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With