2012-01-10 7 views
1

私はMockitoを使用してクラスを模擬しようとしていますが、PowerMockも使用しています。 これは、テストを実行しようとしたとき、私は次のエラーを取得するテストClassNotFoundクラスを模擬するためにmockitoを使用するとエラーが発生する

@RunWith(PowerMockRunner.class) 
@PrepareForTest(value = Util.class) 
public final class FSNS_MLFTUnitTests 
{ 
    @Test 
    public final void testChecksum() 
    { 
     final Util mockedServiceB = mock(Util.class); 
     try 
     { 
      whenNew(Util.class).withNoArguments().thenReturn(mockedServiceB); 
     } 
     catch (final Exception e) 
     { 
      System.out.println("Exception thrown: " + e); 
     } 
} 

です。

java.lang.ExceptionInInitializerError 
at sun.reflect.GeneratedSerializationConstructorAccessor6.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:501) 
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40) 
at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59) 
at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:120) 
at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:60) 
at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:79) 
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:53) 
at org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:80) 
at com.cerner.edc.ccm.host.drivers.fsns.mlft.FSNS_MLFTUnitTests.testChecksum(FSNS_MLFTUnitTests.java:23) 
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:592) 
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:322) 
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86) 
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:309) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:297) 
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84) 
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:222) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:161) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:135) 
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) 
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:133) 
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:44) 
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: com.system.exception.ExceptionAdapter 
    at com.util.lang.ClassAssistant.lookupClass(ClassAssistant.java:50) 
    at com.util.lang.ClassAssistant.lookupClass(ClassAssistant.java:66) 
    at com.logging.edc.EdcAssistant.getResourceBundle(EdcAssistant.java:113) 
    at com.logging.edc.EdcLogger.<init>(EdcLogger.java:26) 
    at com..logging.edc.EdcLoggerManager.getLogger(EdcLoggerManager.java:50) 
    at com.framework.Util.<clinit>(Util.java:65) 
    ... 36 more 

このエラーは、モック(Util.class)でスローされています。

<dependency> 
    <groupId>org.powermock.modules</groupId> 
    <artifactId>powermock-module-junit4</artifactId> 
    <version>1.3.1</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.powermock.api</groupId> 
    <artifactId>powermock-api-mockito</artifactId> 
    <version>1.3.1</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.6</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
    <groupId>org.mockito</groupId> 
    <artifactId>mockito-all</artifactId> 
    <version>1.8.0</version> 
</dependency> 

をすべてのヘルプがappreicatedさ:

これらは私が使用しています以下のPOMの依存関係です。

ありがとうございます!

答えて

4

はのは、スタックトレースの下の部分を分析してみましょう:

Caused by: com.cerner.system.exception.ExceptionAdapter 
    at com.cerner.system.util.lang.ClassAssistant.lookupClass(ClassAssistant.java:50) 

私はそれがここでかなり明確だと思う:com.cerner.system.util.lang.ClassAssistantのライン50はcom.cerner.system.exception.ExceptionAdapterを引き起こしています。

at com.cerner.system.util.lang.ClassAssistant.lookupClass(ClassAssistant.java:66) 
    at com.cerner.system.instrument.logging.edc.EdcAssistant.getResourceBundle(EdcAssistant.java:113) 
    at com.cerner.system.instrument.logging.edc.EdcLogger.<init>(EdcLogger.java:26) 
    at com.cerner.system.instrument.logging.edc.EdcLoggerManager.getLogger(EdcLoggerManager.java:50) 

com.cerner.system.instrument.logging.edc.EdcLoggerManagerの実際の建設はロガーを得るするために、いくつかのクラスを検索しようとしているようです。

at com.cerner.edc.ccm.host.drivers.framework.Util.<clinit>(Util.java:65) 

は、ここでは、代わりにメソッド名の<clinit>見、それはそれは、クラスの静的な一部であることを意味します。これは、EdcLoggerMangerのときにが発生し、(Utilクラスの65行目)であるため、UtilクラスがJVMによって正しく読み込まれないことを意味します。

その後、Utilクラスのインスタンスを作成しようとすると、JVMはこのクラスが見つからない、つまりClassNotFoundと言います。

どのように修正するのですか? 実際のコードに関する情報はあまりありません。しかし、なぜこの行com.cerner.system.util.lang.ClassAssistant.lookupClass(ClassAssistant.java:66)が実際にcom.cerner.system.exception.ExceptionAdapterを投げているのかを調べるべきです。

または、最終的にEdcLoggerManager.getLogger(...)をモックすることができます。

このコードがレガシーでない場合、PowerMockは悪い設計(テスト可能でないコード、ポーの進化率、保守性の悪さ)からあなたを守らないので、本当にお勧めします。真のOOPデザインを適切な練習とパターンで受け入れてください。

関連する問題