0

У меня есть класс, содержащий встроенные методы и статический инициализатор, который загружает dll и высмеивает его с помощью powermock, так что статический инициализатор должен быть подавлен и DLL не должна быть загружена.Powermock - @SupressStaticInitializationFor не работает

Класс выглядит следующим образом:

class UsbCommunication { 

    static { 
     //load some dll 
    } 

    public static native void nativeFunction(); 

} 

Под окнами тесты успешно выполнены с использованием Maven (в затмении, а также ЦМД). Но когда я позволяю нашему CI-серверу (системе unix) строить проект, все тесты получают ошибки.

Тест выглядит следующим образом:

@RunWith(PowerMockRunner.class) 
@SuppressStaticInitializationFor 
    ("com.printerStatus.UsbCommunication") 
public class PrinterTest { 
    //Test code 
} 

Что запутанным для меня является то, что я получаю java.lang.UnsatisfiedLinkError о том, что длл не может быть загружен, несмотря на то, что статический инициализатор должен быть подавленным.

Версии:

  • Mockito: 1.9.0
  • PowerMock: 1.4.12
  • JDK: 1,7

Кроме того, я должен добавить это к pom.xml в качестве обходного пути для этой проблемы: PowerMock Issue

<profile> 
    <id>SplitVerifier</id> 
    <activation> 
     <activeByDefault>true</activeByDefault> 
    </activation> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.12</version> 
       <configuration> 
        <argLine>-XX:-UseSplitVerifier</argLine> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
</profile> 

Это StackTrace я получаю:

java.lang.UnsatisfiedLinkError: Can't load library 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1828) 
    at java.lang.Runtime.load0(Runtime.java:792) 
    at java.lang.System.load(System.java:1059) 
    at de.kriegerit.tools.customPrinterStatusTools.CeSMLm.<clinit>(CeSMLm.java:9) 
    at sun.reflect.GeneratedSerializationConstructorAccessor6.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    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:111) 
    at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:51) 
    at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:100) 
    at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:58) 
    at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70) 
    at de.kriegerit.tools.customPrinterStatusTools.PrinterInterfaceTest.setup(PrinterInterfaceTest.java:42) 
    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:601) 
    at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:129) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:93) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:296) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:112) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:73) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:284) 
    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:209) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:148) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:122) 
    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:120) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:42) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:236) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:134) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:113) 
    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:601) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:103) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:74) 

Есть ли известная проблема или решение этой проблемы?

ответ

-1

Я думаю, проблема в том, что вы пытаетесь загрузить Windows DLL, на машине Unix ;-)

+0

Вот почему я дразнил его PowerMock используя @SuppressStaticInitialization annontation подавить часть кода, который загружает длл. – BeWu

+0

@ user2248239 Кажется, что он терпит неудачу (не могли бы вы проверить, что он работает с некоторым выходом в статическом методе?). Разве вы не можете высмеивать полный класс 'UsbCommunication', а не только метод? – Kai

+0

@ user2248239 Не нужно также аннотировать '@ PrepareForTest'? – Kai

Смежные вопросы