EasyMock for GWT + MVP ?

298 views
Skip to first unread message

fke...@gmail.com

unread,
Oct 25, 2009, 12:58:46 AM10/25/09
to Google Web Toolkit
I remember EasyMock didn't work for GWT, because it needed reflection,
which wasn't available for client side programming. However, I'm doing
MVP tests, so the code need not run in hosted mode, so EasyMode should
run... right? However, I'm getting the following error -- can somebody
point me in the right direction?



java.lang.NoClassDefFoundError: net/sf/cglib/proxy/Enhancer at
org.easymock.classextension.internal.MocksClassControl.createProxyFactory
(MocksClassControl.java:78)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:
50)
at org.easymock.classextension.EasyMock.createMock(EasyMock.java:46)
at com.fkereki.mvptest.client.LoginPresenterTest.setUp
(LoginPresenterTest.java:18)
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:616)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall
(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run
(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively
(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate
(RunBefores.java:27)
at org.junit.internal.runners.statements.RunAfters.evaluate
(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild
(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild
(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate
(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate
(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
(JUnit4TestReference.java:46)
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.ClassNotFoundException:
net.sf.cglib.proxy.Enhancer
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
... 27 more


lowecg2004

unread,
Oct 25, 2009, 7:11:05 AM10/25/09
to Google Web Toolkit
Your error looks like you're using the EasyMock class extensions and
are missing cglib jars from your build path.

As it happens, I recently produced a getting started with MVP and unit
testing with EasyMock article which might be of use:

http://blog.hivedevelopment.co.uk/2009/10/introduction-to-mvp-unit-testing-part.html

Cheers,

Chris.

fke...@gmail.com

unread,
Oct 25, 2009, 9:32:28 AM10/25/09
to Google Web Toolkit
On Oct 25, 9:11 am, lowecg2004 <chris.lowe...@gmail.com> wrote:
> Your error looks like you're using the EasyMock class extensions and
> are missing cglib jars from your build path.
>
> As it happens, I recently produced a getting started with MVP and unit
> testing with EasyMock article which might be of use:
>
> http://blog.hivedevelopment.co.uk/2009/10/introduction-to-mvp-unit-te...
>

Hi! Thanks for the heads up -- however, I find a couple of details:

* I added asm-3.1.jar and cglib-2.2.jar, which were in the GWT 2.0
tools/lib directory, but there was no asm-attrs.jar; do you still need
it?

* When running an empty JUnit (*not* GWTTestCase) test, which just
does loginViewMock=createMock(LoginView.class) I get another
exception... The GWT.create( ) problem -- how did you handle it? Or
did I miss a step in your article?

Thanks!!


java.lang.ExceptionInInitializerError
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:616)
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.classextension.internal.ClassProxyFactory.createProxy
(ClassProxyFactory.java:108)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:
51)
at org.easymock.classextension.EasyMock.createMock(EasyMock.java:46)
at com.fkereki.mvptest.client.LoginPresenterTest.testLoginPresenter1
(LoginPresenterTest.java:26)
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:616)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall
(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run
(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively
(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate
(InvokeMethod.java:20)
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:92)
at com.google.gwt.user.client.ui.UIObject.<clinit>(UIObject.java:140)
... 35 more

Arthur Kalmenson

unread,
Oct 25, 2009, 1:44:11 PM10/25/09
to google-we...@googlegroups.com
It's possible to use EasyMock to mock out GWT widgets in a standard
JUnit or TestNG test, but you need to use GWTMockUtilities to disarm
GWT.

--
Arthur Kalmenson

lowecg2004

unread,
Oct 25, 2009, 3:26:51 PM10/25/09
to Google Web Toolkit
As Arthur said, calling GWTMockUtilities.disarm() will prevent that
error (that was in part 2 of my article :)

As for needing asm-attrs.jar, I guess try it - any
NoClassDefFoundError that looks asm related then that will answer your
question...

Cheers,

Chris.

Thomas Broyer

unread,
Oct 25, 2009, 8:49:57 PM10/25/09
to Google Web Toolkit


On 25 oct, 14:32, "fker...@gmail.com" <fker...@gmail.com> wrote:
> On Oct 25, 9:11 am, lowecg2004 <chris.lowe...@gmail.com> wrote:
>
> > Your error looks like you're using the EasyMock class extensions and
> > are missing cglib jars from your build path.
>
> > As it happens, I recently produced a getting started with MVP and unit
> > testing with EasyMock article which might be of use:
>
> >http://blog.hivedevelopment.co.uk/2009/10/introduction-to-mvp-unit-te...
>
> Hi! Thanks for the heads up -- however, I find a couple of details:
>
> * I added asm-3.1.jar and cglib-2.2.jar, which were in the GWT 2.0
> tools/lib directory, but there was no asm-attrs.jar; do you still need
> it?
>
> * When running an empty JUnit (*not* GWTTestCase) test, which just
> does loginViewMock=createMock(LoginView.class) I get another
> exception... The GWT.create( ) problem -- how did you handle it? Or
> did I miss a step in your article?

You'd generally mock your LoginPresenter.Display interface (or however
you called it, your probably have one; otherwise, here is when it is
useful to have one ;-) ), not your LoginView, which uses widgets,
which need GWTMockUtilities (but it does not always work: History for
instance cannot be used in "pure Java", even with
GWTMockUtilities.disarm()).

fke...@gmail.com

unread,
Oct 26, 2009, 9:32:29 PM10/26/09
to Google Web Toolkit
On Oct 25, 5:26 pm, lowecg2004 <chris.lowe...@gmail.com> wrote:
> As Arthur said, calling GWTMockUtilities.disarm() will prevent that
> error (that was in part 2 of my article :)
>
> As for needing asm-attrs.jar, I guess try it - any
> NoClassDefFoundError that looks asm related then that will answer your
> question...

Hi! Thanks for the help -- and as of now, everything is running fine
without asm-attrs.jar, though I'll keep it in mind just in case.. ;-)

lowecg2004

unread,
Oct 27, 2009, 7:46:03 PM10/27/09
to Google Web Toolkit
Cool - glad to hear you're up and running.
Reply all
Reply to author
Forward
0 new messages