ClassNotFound Ошибка при использовании mockito для макета класса - PullRequest
1 голос
/ 10 января 2012

Я пытаюсь смоделировать класс с помощью Mockito, а также с помощью PowerMock. Это тест

@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).

Это следующие зависимости pom, которые я использую:

<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>

Любая помощь оценена.

Спасибо !!

1 Ответ

4 голосов
/ 10 января 2012

Давайте проанализируем нижнюю часть стека трассировки:

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

Я думаю, здесь все ясно: строка 50 из com.cerner.system.util.lang.ClassAssistant вызывает 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> вместо имени метода, это означает, что это статическая часть класса. Это означает, что класс Util не может быть корректно загружен JVM, поскольку ExceptionAdapter повышается, когда EdcLoggerManger равен , получая регистратор (строка 65 класса Util).

Затем при последующих попытках создания экземпляра класса Util JVM скажет, что этот класс не найден, т. Е. Ваш ClassNotFound.

Как это исправить? У меня не так много информации о вашем фактическом коде. Но вы должны проверить, почему эта строка com.cerner.system.util.lang.ClassAssistant.lookupClass(ClassAssistant.java:66) на самом деле выдает com.cerner.system.exception.ExceptionAdapter.

Или, в конце концов, вы можете издеваться над EdcLoggerManager.getLogger (...).

В качестве напоминания, если этот код не является устаревшим, я настоятельно рекомендую вам избегать PowerMock, поскольку он не защитит вас от плохого дизайна (плохо проверяемый код, эволюция порра, плохая ремонтопригодность). Вместо этого используйте истинный дизайн ООП с хорошей практикой и схемами, где это уместно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...