Error mocking super invocations in a method

79 views
Skip to first unread message

Kartik Kumar

unread,
Sep 26, 2010, 3:45:44 PM9/26/10
to powe...@googlegroups.com
Hi Powermock gurus,

I have an issue that I need help with. I am trying to test a method that extends another class. I am trying to mock the method in the super class  because my method that I want to test invokes the super to invoke methods in parent class. My method is as follows:

public class QueryHandler extends DbItemFetcher {
  // Static variable
  private static final GenericFetch genericFetch = new GenericFetch();
@Override
    public Item doQuery(Partner p, String itemId) throws PartnerFetchException {
          ItemType it = super.findMatchingItemType(p, itemId);
          if (it != null) {
            FetchMode fm = it.getFetchMode();
            if (FetchMode.AttributeStore == fm) {
              return super.doQuery(p, itemId);
            } else {
              String jaxbPackage = "com.teracent.overstock.bind";
              return genericFetch.doQuery(p, itemId, jaxbPackage);
            }
          }
    }
}

My policy implementation:

public class DbItemFetcherPolicy implements PowerMockPolicy {

 @Override
  public void applyClassLoadingPolicy(MockPolicyClassLoadingSettings settings) {
    settings.
        addFullyQualifiedNamesOfClassesToLoadByMockClassloader(
            DbItemFetcher.class.getName());
  }

  /**
   * Stub {@link DbItemFetcher#doQuery(Partner, String)} and
   * {@link DbItemFetcher#findMatchingItemType(Partner, String)} to be loaded
   * by Powermock class loader.
   */
  @Override
  public void applyInterceptionPolicy(MockPolicyInterceptionSettings settings) {
    Method superDoQuery =
        Whitebox.getMethod(DbItemFetcher.class, "doQuery", Partner.class,
            String.class);
    Method superFindMatchingType =
        Whitebox.getMethod(DbItemFetcher.class, "findMatchingItemType",
            Partner.class, String.class);
    // Stub to return a mock object.
    Item item = PowerMock.createMock(Item.class);
    // Mock super.doQuery(Partner, String) 
    settings.stubMethod(superDoQuery, item);
    // Stub super.findMatchingType(Partner, String) to return a dummy object.
    settings.stubMethod(superFindMatchingType, new ItemType());
    // Static variable in Super class.
    settings.addFieldTypesToSuppress(
        new String[] {"feedServer", "config", "test", "log", "hostFailures",
            "merchantDao", "productDao", "itemTypeDao", "fetchModes"});
  }

}

I used this http://code.google.com/p/powermock/source/browse/trunk/modules/module-test/powermock/junit4-test/src/test/java/samples/junit4/mockpolicy/MockPolicyUsageExampleTest.java as an example

I get this error:

java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at javassist.runtime.Desc.getClassObject(Desc.java:43)
    at javassist.runtime.Desc.getClassType(Desc.java:152)
    at javassist.runtime.Desc.getType(Desc.java:122)
    at javassist.runtime.Desc.getType(Desc.java:78)
    at com.teracent.overstock.OverstockItemQueryHandlerTest.setUp(OverstockItemQueryHandlerTest.java:35)
    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)
Caused by: java.util.MissingResourceException: Configuration property not defined: feedServer
    at com.teracent.config.Configuration.getString(Configuration.java:334)
    at com.teracent.partnerfetch.generic.DbItemFetcher.<clinit>(DbItemFetcher.java:49)
    ... 37 more



Reply all
Reply to author
Forward
0 new messages