Java 运行测试套件时PowerMockito和SWT出现不满意的链接错误

Java 运行测试套件时PowerMockito和SWT出现不满意的链接错误,java,unit-testing,swt,eclipse-rcp,powermock,Java,Unit Testing,Swt,Eclipse Rcp,Powermock,我正在用JUnit和PowerMockito为Eclipse RCP应用程序中的类编写单元测试。 如果我以独立方式运行每个测试,则一切正常 但当我将测试分组到TestSuite时,所有测试都会失败,并出现以下错误: java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: no swt-win32-3836 in java.library.path no swt-win32 in java.libr

我正在用JUnit和PowerMockito为Eclipse RCP应用程序中的类编写单元测试。 如果我以独立方式运行每个测试,则一切正常

但当我将测试分组到TestSuite时,所有测试都会失败,并出现以下错误:

java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: 
    no swt-win32-3836 in java.library.path
    no swt-win32 in java.library.path
    Native Library C:\Users\franzm\.swt\lib\win32\x86_64\swt-win32-3836.dll already loaded in another classloader
    Can't load library: C:\Users\franzm\.swt\lib\win32\x86_64\swt-win32.dll

    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:331)
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:240)
    at org.eclipse.swt.internal.C.<clinit>(C.java:21)
    at org.eclipse.swt.widgets.Widget.<clinit>(Widget.java:103)
    at com.example.app.client.ui.filters.FilterDtoUtil.formatDateFormat(FilterDtoUtil.java:325)
    at com.example.app.client.ui.filters.FilterDtoUtil.getMarketVariantsProductionSitesWithDates(FilterDtoUtil.java:358)
    at com.example.app.client.ui.filters.factories.FilterContributor.getFilterRow(FilterContributor.java:566)
    at com.example.app.client.ui.filters.factories.AbstractBigFilterFactory.getFilterRow(AbstractBigFilterFactory.java:59)
    at com.example.app.client.ui.excelexport.AbstractExcelTest.before(AbstractExcelTest.java:73)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:132)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:95)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
    at org.junit.runners.Suite.runChild(Suite.java:127)
    at org.junit.runners.Suite.runChild(Suite.java:26)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    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)
java.lang.UnsatisfiedLinkError:无法加载SWT库。原因:
java.library.path中没有swt-win32-3836
java.library.path中没有swt-win32
本机库C:\Users\franzm\.swt\lib\win32\x86\u 64\swt-win32-3836.dll已加载到另一个类加载器中
无法加载库:C:\Users\franzm\.swt\lib\win32\x86\u 64\swt-win32.dll
位于org.eclipse.swt.internal.Library.loadLibrary(Library.java:331)
位于org.eclipse.swt.internal.Library.loadLibrary(Library.java:240)
在org.eclipse.swt.internal.C.(C.java:21)
位于org.eclipse.swt.widgets.Widget.(Widget.java:103)
位于com.example.app.client.ui.filters.FilterDtoUtil.formatDateFormat(FilterDtoUtil.java:325)
位于com.example.app.client.ui.filters.FilterDtoUtil.getMarketVariantsProductionSitesWithDates(FilterDtoUtil.java:358)
在com.example.app.client.ui.filters.factories.FilterContributor.getFilterRow(FilterContributor.java:566)
位于com.example.app.client.ui.filters.factories.AbstractBigFilterFactory.getFilterRow(AbstractBigFilterFactory.java:59)
位于com.example.app.client.ui.excelexport.AbstractExcelTest.before(AbstractExcelTest.java:73)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:132)
位于org.junit.internal.runners.MethodRoadie.runbeforesthentestthenuter(MethodRoadie.java:95)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runbeforesthenTesttheAfter(PowerMockJUnit44RunnerDelegateImpl.java:282)
位于org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
位于org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.invokeTestMethod(powermockjunit44runnerdelegateinpl.java:207)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.runMethods(powermockjunit44runnerdelegateinpl.java:146)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl$1.run(powermockjunit44runnerdelegateinpl.java:120)
位于org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
位于org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.run(powermockjunit44runnerdelegateinpl.java:118)
位于org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104)
位于org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
位于org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
位于org.junit.runners.Suite.runChild(Suite.java:127)
位于org.junit.runners.Suite.runChild(Suite.java:26)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:309)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
好的,我知道问题是DLL已经加载了。但是我怎么才能避开这个问题呢? 我们在stackoverflow()中有一个答案,但这对我一点帮助都没有。找到所有可能使用SWT的类对于获得结果来说是非常困难的

难道没有更好的解决办法吗


(编辑:我使用PowerMockito模拟静态类)

您不能消除模拟该静态类的需要吗?要么通过使它不是静态的,要么通过使用真实的类。我只使用过一次PowerMockito。然后我找到了JMockit,再也没有回头。不确定它是否能解决您的问题,但值得一试——它非常易于使用,您可以用它来模拟静态方法,没有问题@Mirco我知道这已经很久了,但你有没有弄清楚这件事的真相?@linuxNoob没有,对不起。@Mirco你最终删除了powermock吗?