2011-02-28 139 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创建的对象()