Error mocking final class with static method with JUnit 4.x and EasyMock

802 views
Skip to first unread message

Kartik Kumar

unread,
Sep 21, 2010, 9:14:03 PM9/21/10
to powe...@googlegroups.com
Hi,

I am trying to mock this method using EasyMock and JUnit 4.x

Partner p = Partner.getByCode(27); where the method getByCode(int) accepts only primitive integer value.

Partner is final class.

This is my unit test:

@RunWith(PowerMockRunner.class)
public class OverstockItemQueryHandlerTest {
 
  private Partner partner;
 
  @Before
  public void setUp() throws Exception {
    partner = PowerMock.createMock(Partner.class);
    PowerMock.stub(PowerMock.method(Partner.class, "getByCode", int.class))
        .toReturn(partner);
    EasyMock.expect(Partner.getByCode(27)).andReturn(Overstock.Overstock);
  }
 
  /**
   *
   * @throws Exception
   */
  @Test
  public void testFoo() throws Exception {
    // User Partner here.
  }

}

Is there anything I am doing wrong?

Kartik




Kartik Kumar

unread,
Sep 21, 2010, 9:18:58 PM9/21/10
to powe...@googlegroups.com
I forgot to include my stack trace.

java.lang.NoSuchMethodError: org.junit.internal.runners.MethodValidator.<init>(Lorg/junit/internal/runners/TestClass;)V
    at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.<init>(PowerMockJUnit4MethodValidator.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.validate(PowerMockJUnit44RunnerDelegateImpl.java:122)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.<init>(PowerMockJUnit44RunnerDelegateImpl.java:85)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:154)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:49)
    at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:231)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:69)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:36)
    at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:27)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:28)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:24)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:40)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:30)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:445)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

Johan Haleby

unread,
Sep 22, 2010, 2:15:07 AM9/22/10
to powe...@googlegroups.com
Hmm it looks that there are two different things going on. First of all you seem to be using an non-compliant combination of JUnit and PowerMock runner. See the first section on the FAQ. Second, you should not do EasyMock.expect(..) when you stub a method using the stubbing API. 

PowerMock.stub(PowerMock.method(Partner.class, "getByCode", int.class).toReturn(partner);

This is enough! (I prefer to use static imports though, stub(method(Partner.class, "getByCode", int.class).toReturn(partner); for better readability).

/Johan


--
You received this message because you are subscribed to the Google Groups "PowerMock" group.
To post to this group, send email to powe...@googlegroups.com.
To unsubscribe from this group, send email to powermock+...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/powermock?hl=en.

Kartik Kumar

unread,
Sep 22, 2010, 7:42:07 PM9/22/10
to powe...@googlegroups.com
Hi Johan,

Thanks for replying. I have using legacy PowerMockRunner and it still fails because my class Partner is not an interface.

My stack trace is given below:

java.lang.IllegalArgumentException: com.teracent.partnerfetch.common.Partner is not an interface
    at java.lang.reflect.Proxy.getProxyClass(Proxy.java:362)
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
    at org.easymock.internal.JavaProxyFactory.createProxy(JavaProxyFactory.java:12)
    at org.easymock.internal.MocksControl.createMock(MocksControl.java:36)
    at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2211)
    at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2162)
    at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:98)
    at com.teracent.overstock.OverstockItemQueryHandlerTest.setUp(OverstockItemQueryHandlerTest.java:27)
    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 org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74)
    at org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    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 org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:2035)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:913)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:829)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:442)
    at org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestMethodRunner.run(PowerMockJUnit4LegacyTestMethodRunner.java:67)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
    at org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestClassMethodsRunner.run(PowerMockJUnit4LegacyTestClassMethodsRunner.java:97)
    at org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunnerDelegateImpl$1.runUnprotected(PowerMockJUnit4LegacyRunnerDelegateImpl.java:69)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunnerDelegateImpl.run(PowerMockJUnit4LegacyRunnerDelegateImpl.java:85)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:112)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)




Kartik Kumar

unread,
Sep 22, 2010, 9:02:30 PM9/22/10
to powe...@googlegroups.com
I used a powermock 1.3.9 release to see if it is happening with older version of powermock and I get a different error.

java.lang.IllegalArgumentException: Cannot subclass final class class com.teracent.partnerfetch.common.Partner
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
    at org.powermock.api.easymock.internal.signedsupport.SignedSupportingClassProxyFactory.createProxy(SignedSupportingClassProxyFactory.java:155)
    at org.easymock.internal.MocksControl.createMock(MocksControl.java:36)
    at org.powermock.api.easymock.PowerMock.doCreateMock(PowerMock.java:2160)
    at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2115)
    at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:97)

    at com.teracent.overstock.OverstockItemQueryHandlerTest.setUp(OverstockItemQueryHandlerTest.java:27)
    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 org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74)
    at org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    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 org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1630)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:724)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:681)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:440)

    at org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestMethodRunner.run(PowerMockJUnit4LegacyTestMethodRunner.java:67)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
    at org.powermock.modules.junit4.legacy.internal.impl.testcaseworkaround.PowerMockJUnit4LegacyTestClassMethodsRunner.run(PowerMockJUnit4LegacyTestClassMethodsRunner.java:97)
    at org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunnerDelegateImpl$1.runUnprotected(PowerMockJUnit4LegacyRunnerDelegateImpl.java:69)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.powermock.modules.junit4.legacy.internal.impl.PowerMockJUnit4LegacyRunnerDelegateImpl.run(PowerMockJUnit4LegacyRunnerDelegateImpl.java:85)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:112)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:55)

    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)



Johan Haleby

unread,
Sep 23, 2010, 4:30:38 AM9/23/10
to powe...@googlegroups.com
Do you prepare com.teracent.partnerfetch.common.Partner for test?

/Johan

Kartik Kumar

unread,
Sep 24, 2010, 10:58:48 PM9/24/10
to PowerMock
Hi Johan,

It works for me. Thanks for your time.

Kartik

On Sep 22, 6:02 pm, Kartik Kumar <krishnan.1...@gmail.com> wrote:
> I used a powermock 1.3.9 release to see if it is happening with older
> version of powermock and I get a different error.
>
> *java.lang.IllegalArgumentException: Cannot subclass final class class
> com.teracent.partnerfetch.common.Partner*
> On Wed, Sep 22, 2010 at 4:42 PM, Kartik Kumar <krishnan.1...@gmail.com>wrote:> Hi Johan,
> > On Tue, Sep 21, 2010 at 11:15 PM, Johan Haleby <johan.hal...@gmail.com>wrote:
>
> >> Hmm it looks that there are two different things going on. First of all
> >> you seem to be using an non-compliant combination of JUnit and PowerMock
> >> runner. See the first section on the FAQ<http://code.google.com/p/powermock/wiki/FAQ>.
> >> Second, you should not do EasyMock.expect(..) when you stub a method using
> >> the stubbing API.
>
> >> PowerMock.stub(PowerMock.method(Partner.class, "getByCode",
> >> int.class).toReturn(partner);
>
> >> This is enough! (I prefer to use static imports though, *stub(method(Partner.class,
> >> "getByCode", int.class).toReturn(partner)*; for better readability).
>
> >> /Johan
> >>> powermock+...@googlegroups.com<powermock%2Bunsu...@googlegroups.com>
> >>> .
> >>> For more options, visit this group at
> >>>http://groups.google.com/group/powermock?hl=en.
>
> >>  --
> >> You received this message because you are subscribed to the Google Groups
> >> "PowerMock" group.
> >> To post to this group, send email to powe...@googlegroups.com.
> >> To unsubscribe from this group, send email to
> >> powermock+...@googlegroups.com<powermock%2Bunsu...@googlegroups.com>
> >> .
Reply all
Reply to author
Forward
0 new messages