Reputation: 33297
In GWT the code for a Generator is located in the rebind package. This package is not included in the module xml file, since it might contain non client code.
Here is what I did. My module file is /test/gwttest.gwt.xml. It contains the following:
<generate-with class="test.rebind.FunctionGenerator">
<when-type-assignable class="test.client.Function" />
</generate-with>
<source path='client'/>
Here is /test/client/Function:
public interface Function {
public Object execute();
}
My Generator is /test/rebind/FunctionGenerator:
public class FunctionGenerator extends Generator {
private static final String IMPL_TYPE_NAME = Function.class.getSimpleName()
+ "Impl";
private static final String IMPL_PACKAGE_NAME = Function.class.getPackage()
.getName();
@Override
public String generate(TreeLogger logger, GeneratorContext context,
String requestedClass) throws UnableToCompleteException {
TypeOracle typeOracle = context.getTypeOracle();
JClassType functionType = typeOracle.findType(requestedClass);
assert Function.class.equals(functionType.getClass());
ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(
IMPL_PACKAGE_NAME, IMPL_TYPE_NAME);
composerFactory.addImport(Function.class.getCanonicalName());
composerFactory.addImplementedInterface(Function.class.getName());
PrintWriter printWriter = context.tryCreate(logger, IMPL_PACKAGE_NAME,
IMPL_TYPE_NAME);
SourceWriter sourceWriter = composerFactory.createSourceWriter(context,
printWriter);
sourceWriter.print("public Object execute() {");
sourceWriter.print(" return 1;");
sourceWriter.print("}");
sourceWriter.commit(logger);
return IMPL_PACKAGE_NAME + "." + IMPL_TYPE_NAME;
}
}
My GeneratorTest is /test/rebind/FunctionGeneratorTest:
public class FunctionGeneratorTest extends GWTTestCase {
@Override
public String getModuleName() {
return "com.acme.gwt.Generator";
}
public void testGenerator() throws Exception {
Function function = GWT.create(Function.class);
assertNotNull(function);
assertEquals(1, function.execute());
}
}
The test always fails because with this error:
com.google.gwt.junit.JUnitFatalLaunchException: The test class 'test.rebind.FunctionGeneratorTest' was not found in module 'test.Gwttest'; no compilation unit for that type was seen
at com.google.gwt.junit.JUnitShell.checkTestClassInCurrentModule(JUnitShell.java:766)
at com.google.gwt.junit.JUnitShell.runTestImpl(JUnitShell.java:1349)
at com.google.gwt.junit.JUnitShell.runTestImpl(JUnitShell.java:1311)
at com.google.gwt.junit.JUnitShell.runTest(JUnitShell.java:705)
at com.google.gwt.junit.client.GWTTestCase.runTest(GWTTestCase.java:421)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at com.google.gwt.junit.client.GWTTestCase.run(GWTTestCase.java:247)
at junit.framework.TestSuite.runTest(TestSuite.java:255)
at junit.framework.TestSuite.run(TestSuite.java:250)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
I cannot include the rebind folder as source in my module file since it is no client code.
What do I have to do?
When I move the test from /test/rebind to /test/client it works with Eclipse Run as > GWT Unit Test.
When I try Eclipse Run as > GWT Unit Test (production mode) the test fails.
Here is the trace:
com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)
at com.google.gwt.junit.JUnitShell.compileForWebMode(JUnitShell.java:1125)
at com.google.gwt.junit.JUnitShell.maybeCompileForWebMode(JUnitShell.java:1174)
at com.google.gwt.junit.CompileStrategy.maybeCompileModuleImpl2(CompileStrategy.java:180)
at com.google.gwt.junit.CompileStrategy.maybeCompileModuleImpl(CompileStrategy.java:112)
at com.google.gwt.junit.SimpleCompileStrategy.maybeCompileModule(SimpleCompileStrategy.java:36)
at com.google.gwt.junit.JUnitShell.runTestImpl(JUnitShell.java:1342)
at com.google.gwt.junit.JUnitShell.runTestImpl(JUnitShell.java:1311)
at com.google.gwt.junit.JUnitShell.runTest(JUnitShell.java:705)
at com.google.gwt.junit.client.GWTTestCase.runTest(GWTTestCase.java:421)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at com.google.gwt.junit.client.GWTTestCase.run(GWTTestCase.java:247)
at junit.framework.TestSuite.runTest(TestSuite.java:255)
at junit.framework.TestSuite.run(TestSuite.java:250)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Why does the test fails in production mode and passes in dev mode?
Upvotes: 0
Views: 490
Reputation:
See this link: https://groups.google.com/forum/#!topic/google-web-toolkit/OyH839KEH-w
This will help to make the production code working:
PrintWriter printWriter = context.tryCreate(logger, IMPL_PACKAGE_NAME, IMPL_TYPE_NAME);
if (printWriter != null) {
....
}
return IMPL_PACKAGE_NAME + "." + IMPL_TYPE_NAME;
Upvotes: 1