2011-08-04 48 views
9

也許有人可以幫助我,我正在嘗試編寫我的第一個gwt單元測試,但問題在於,當我用maven運行測試時得到這個錯誤:GWT測試錯誤NoClassDefFoundError:com/google/gwt/dev/cfg /條件

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

這裏是我的測試用例:

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(); 
      } 
     }); 
    } 

} 

而在com.karq.tvkava我所說的模塊文件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> 

而且ofcourse我有com.karq.tvkava主模塊和其所謂的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> 
+0

你解決了嗎? –

回答

4

你有在類路徑中都gwt-user.jargwt-dev.jar

+0

是的,我有我的班級路徑。 – karq

10

我設法讓Surefire與我的GWT測試無縫協作,在測試失敗時輸出正確的結果並失敗構建。在我的POM,我有神火設置像這樣:

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

你需要定義變量project.build.sourceDirectoryproject.build.testSourceDirectory。對我來說他們就像<project-name>/src/main/java<project-name>/src/test/java

我也不得不在依賴加上gwt-dev

<dependency> 
    <groupId>com.google.gwt</groupId> 
    <artifactId>gwt-dev</artifactId> 
    <version>2.4.0</version> 
    <scope>provided</scope> 
</dependency> 
5

我有同樣的確切堆棧跟蹤並添加

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

固定它。

1

如果您已將SureTire作爲JUnit測試運行GWTTest,您將會收到此錯誤消息。由於SureFire不知道如何處理GWT代碼,你會得到這個錯誤。

最好告訴SureFire忽略給定模式下的所有測試。我將我所有的GWT測試命名爲「SomethingGwtTest.java」。這種方式SureFire忽略它們,gwt-maven-plugin的GWT測試運行者將它們選中並正確運行。

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <excludes> 
      <exclude>**/*GwtTest.java</exclude> 
     </excludes> 
    </configuration> 
</plugin