Unit Tests in GWT (using Maven and eclipse PDE/OSGi)
One of the strengths of GWT, from my point of view, is that large portions of the code (eg business logic) can be tested with plain old JUnit tests, without the slightest interference from servers, web browsers and other constraints.
However, certain parts of the code must be tested in a richer context including the compiled java script or client/server communication. Luckily, the GWTTestCase provides a powerful tool to automate tests in such rich contexts.
Following a few pointers, of how these GWT unit tests can be setup in an environment using Maven and the eclipse PDE (the tests are not exactly using this technology but should be able to be part of a possible OSGi module).
- Create a new gwt module (gwt.xml) in a dedicated package (eg gwttests) in the src/test/java folder such as the following. Make this unit inherit the modules, you want to test.
<?xml version="1.0" encoding="UTF-8"?> <module rename-to='nxservergwttests'> <!-- Inherit the core Web Toolkit stuff. --> <inherits name='com.google.gwt.user.User' />
<!-- Other module inherits --> <inherits name='nx.servergwt.client.NxGwtClient'></inherits> <inherits name="com.google.gwt.junit.JUnit" />
<!-- Specify the app entry point class. --> <entry-point class='nx.servergwt.tests.DummyEntryPoint' />
<!-- Specify the paths for translatable code --> <source path='' />
<set-property name="gwt.suppressNonStaticFinalFieldWarnings" value="true" />
</module> |
- Create a class in that package following the naming pattern: "GwtTest*.java", let this class extend com.google.gwt.junit.client.GWTTestCase. Return a module name pointing to your module (gwt.xml file) for gwtModuleName()
public class GwtTestClientServerCommunication extends GWTTestCase {
@Override public String getModuleName() { return "nx.servergwt.tests.NxServerGwtTests"; }
public void testNetworkOperations() { Network n = Nx.newNetwork(); String root = "root"; Nx.put().node(root).inNetwork(n); Nx.append().node("a string").to(root).inNetwork(n);
assertTrue(Nx.check().ifNode(root).hasChild(Nx.instanceOf(String.class)).inNetwork(n)); }
} |
- Now you should be able to run this test using "mvn gwt:test" (but make sure to check for the pitfalls below).
Some possible pitfalls
-No compilation unit found for test-
The GWT compiler might report that the class of the test case could not be found:
[INFO] com.google.gwt.junit.JUnitFatalLaunchException: The test class ...' was not found in module ...; no compilation unit for that type was seen |
In this case, there might be problem with the module (gwt.xml) file you have defined, for instance you forgot to declare "<source path=_''_ />"
-Need to manually open test case in browser-
When executing gwt:test, the maven gwt plugin (or the gwt compile) might report the following:
[INFO] Please navigate your browser to this URL: [INFO] http://130.216.XX.XX:54530/....JUnit/junit.html?gwt.codesvr=130.216.XX.XX:54526 |
This can be omitted by configuring the maven gwt plugin to utilize htmlunit to lunch a browser. Add the following to the pom.xml:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>gwt-maven-plugin</artifactId> ... <configuration> <htmlunit>IE8</htmlunit> </configuration> <mode>htmlunit</mode> |
Now the tests should run without the need to open a browser manually (see Gwt Maven Plugin Parameters Mode)
-Access to junit.framework in eclipse PDE-
Eclipse PDE might report that: "Access restriction: The method assertTrue(boolean) from the type Assert is not accessible due to restriction on required library"
This can mitigated by adding the following dependency:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.2</version> <scope>test</scope> </dependency> |
As well as the following imported package in the configuration of the maven bnd plugin:
org.junit, com.google.gwt.junit.client, junit.framework, |
After rebuilding the project with "mvn eclipse:clean clean package eclipse:eclipse -Declipse.pde -Declipse.useProjectReferences=false install" and refreshing the files in eclipse, the access restriction error should disappear.
-Calls to server Servlets result in 404 errors-
Some calls per RPC to Servlets on the server might result in 404 errors. In your original project, the Servlets could just be declared in the web.xml configuration. In order for Servlets to work in the GWT unit test, they must be declared in the gwt module definition (and here it is sensible to define them in the module you want to test rather than the 'test' module).
<servlet path='/yourservletforrpc' class='com.yourpackage.Servlet'></servlet> |
Resources
Gwt Maven Plugin Parameters Mode (set this to htmlunit)