2011-02-28 162 views
4

我想非常的JUnit測試的GWT把它失敗GWT的JUnit測試

public class CheckTest extends TestCase 
{ 

    private ServiceAsync RPC; 
    private HandlerManager EventBus; 
    private CreateTopicPresenter.Display CTV; 
    private CreateTopicPresenter CTP; 

    protected void setUp() 
    { 
     RPC= createStrictMock(ServiceAsync.class); 
     EventBus = new HandlerManager(null); 
     CTV= createStrictMock(CreateTopicView.class); 
     CTP= new CreateTopicPresenter(CTV,RPC,EventBus); 
    } 
    public void testCheck() 
    { 

     CTP.View.getFirstMessage().setValue("MessageTest"); 
     assertTrue(CTP.View.getFirstMessage().getValue().equals("MessageTest")); 
    } 

堆棧跟蹤:

java.lang.ExceptionInInitializerError 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at net.sf.cglib.proxy.Enhancer.setCallbacksHelper(Enhancer.java:619) 
     at net.sf.cglib.proxy.Enhancer.setThreadCallbacks(Enhancer.java:612) 
     at net.sf.cglib.proxy.Enhancer.registerCallbacks(Enhancer.java:581) 
     at org.easymock.internal.ClassProxyFactory.createProxy(ClassProxyFactory.java:194) 
     at org.easymock.internal.MocksControl.createMock(MocksControl.java:60) 
     at org.easymock.EasyMock.createStrictMock(EasyMock.java:70) 
     at com.BiddingSystem.client.CheckTest.setUp(CheckTest.java:26) 
     at junit.framework.TestCase.runBare(TestCase.java:128) 
     at junit.framework.TestResult$1.protect(TestResult.java:106) 
     at junit.framework.TestResult.runProtected(TestResult.java:124) 
     at junit.framework.TestResult.run(TestResult.java:109) 
     at junit.framework.TestCase.run(TestCase.java:120) 
     at junit.framework.TestSuite.runTest(TestSuite.java:230) 
     at junit.framework.TestSuite.run(TestSuite.java:225) 
     at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 
     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) 
    Caused by: java.lang.UnsupportedOperationException: ERROR: GWT.create() is only usable in client code! It cannot be called, for example, from server code. If you are running a unit test, check that your test case extends GWTTestCase and that GWT.create() is not called from within an initializer or constructor. 
     at com.google.gwt.core.client.GWT.create(GWT.java:91) 
     at com.google.gwt.user.client.ui.UIObject.<clinit>(UIObject.java:188) 
     ... 24 more 

回答

6

你需要爲了測試代碼擴展GWTTestCase基本類型這取決於GWT運行時間(例如對GWT.create()或JSNI方法的調用)。請注意,GWTTestCase也必須與GWT兼容,所以這會限制您選擇的測試庫。

理想情況下,大多數應用程序代碼可以用「純」TestCases測試,只有特定於客戶端的代碼由GWTTestCases測試,因爲後者的開銷較高。

http://www.gwtproject.org/articles/testing_methodologies_using_gwt.html

2

您的代碼不工作的原因是,標準的JUnit測試運行不處理GWT運行時,如BobV的答覆中提到。他的解決方案可能是最簡單的解決方案,但如果您使用其他框架(如Mockito),這可能不是最簡單的解決方案。在擴展GWTTestCase時,我也發現了一些奇怪的現象。

我更喜歡這樣做的方式是用@RunWith([SomeTestRunner].class)註釋帶頭班。例如,GWT Mockito自帶測試運行器,因此使用它比擴展GWTTestCase更加簡化,因爲它允許您不必重寫測試用例可能擴展的任何父類。

0

在某些情況下調用GWTMockUtilities.disarm()在測試的是與返回null而不是拋出一個運行時異常的方法替換正常的GWT.create()行爲開始,,使寫純用於GWT代碼的JUnit測試(不是GWTTestCase)。

此方法僅適用於被測試類不需要使用GWT.create創建的對象()