【问题标题】:Mockito + PowerMock + TestNG + LibgdxMockito + PowerMock + TestNG + Libgdx
【发布时间】:2018-01-11 19:38:30
【问题描述】:

我正在尝试将 powermock 库添加到工作项目中,但出现错误。

我如何添加它:

1) AbsTest extends PowerMockTestCase

2) Build.gradle 依赖项

3) 在某些测试中添加@PrepareForTest({SomeClass.class})。在这一步之后发生了这个错误。

在 build.gradle 中包含所有库。 在初始化 HeadlessApplication 以使用 Gdx.* 静态变量的地方发生错误。

项目中的所有测试都扩展了这个类:

abstract public class AbsTest extends PowerMockTestCase {

    static {
        initGdx();
    }

    protected static void initGdx() {
        // Initialize libgdx headless for use static vars (e.g. Gdx.input.setInputProcessor)
        final HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
        config.renderInterval = 1f / 60; // Likely want 1f/60 for 60 fps

        new HeadlessApplication(mock(Core.class), config); <=== ERROR LINE
    }

    @BeforeMethod(alwaysRun = true)
    public void initMethod() throws Exception {
        // Initialize mocks
        MockitoAnnotations.initMocks(this);
    }
}

错误:

org.testng.TestNGException:实例化时出错 类 ru.coolone.adventure_emulation.input.InputGroupsTest: null at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:435) 在 org.testng.internal.ClassHelper.createInstance(ClassHelper.java:336) 在 org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:125) 在 org.testng.internal.ClassImpl.getInstances(ClassImpl.java:190) 在 org.testng.TestClass.getInstances(TestClass.java:95) 在 org.testng.TestClass.initTestClassesAndInstances(TestClass.java:81) 在 org.testng.TestClass.init(TestClass.java:73) 在 org.testng.TestClass.(TestClass.java:38) 在 org.testng.TestRunner.initMethods(TestRunner.java:389) 在 org.testng.TestRunner.init(TestRunner.java:271) 在 org.testng.TestRunner.init(TestRunner.java:241) 在 org.testng.TestRunner.(TestRunner.java:167) 在 org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:663) 在 org.testng.SuiteRunner.init(SuiteRunner.java:260) 在 org.testng.SuiteRunner.(SuiteRunner.java:198) 在 org.testng.TestNG.createSuiteRunner(TestNG.java:1271) 在 org.testng.TestNG.createSuiteRunners(TestNG.java:1249) 在 org.testng.TestNG.runSuitesLocally(TestNG.java:1107) 在 org.testng.TestNG.runSuites(TestNG.java:1028) 在 org.testng.TestNG.run(TestNG.java:996) 在 org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72) 在 org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:127) 引起:java.lang.ExceptionInInitializerError at sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.powermock.modules.testng.internal.TestClassInstanceFactory.create(TestClassInstanceFactory.java:51) 在 org.powermock.modules.testng.internal.PowerMockClassloaderObjectFactory.newInstance(PowerMockClassloaderObjectFactory.java:46) 在 org.powermock.modules.testng.PowerMockObjectFactory.newInstance(PowerMockObjectFactory.java:43) 在 org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:423) ... 21 更多原因:java.lang.IllegalStateException:无法 初始化插件:接口 org.mockito.plugins.MockMaker at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:66) 在 com.sun.proxy.$Proxy19.isTypeMockable(Unknown Source) 在 org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29) 在 org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22) 在 org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:186) 在 org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:180) 在 org.mockito.internal.MockitoCore.mock(MockitoCore.java:62) 在 org.mockito.Mockito.mock(Mockito.java:1729) 在 org.mockito.Mockito.mock(Mockito.java:1642) 在 ru.coolone.adventure_emulation.AbsTest.initGdx(AbsTest.java:37) 在 ru.coolone.adventure_emulation.AbsTest.(AbsTest.java:30) ... 29 更多原因:java.lang.IllegalStateException:加载失败 在中声明的接口 org.mockito.plugins.MockMaker 实现 sun.misc.CompoundEnumeration@7dc3712 在 org.mockito.internal.configuration.plugins.PluginLoader.loadImpl(PluginLoader.java:101) 在 org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:45) 在 org.mockito.internal.configuration.plugins.PluginRegistry.(PluginRegistry.java:18) 在 org.mockito.internal.configuration.plugins.Plugins.(Plugins.java:17) 在 org.mockito.internal.util.MockUtil.(MockUtil.java:24) ... 37 更多原因:java.lang.ClassCastException:无法转换 org.powermock.api.mockito.mockmaker.PowerMockMaker 到 org.mockito.plugins.MockMaker 在 java.lang.Class.cast(Class.java:3369) 在 org.mockito.internal.configuration.plugins.PluginLoader.loadImpl(PluginLoader.java:97) ... 41 更多

build.gradle:

...
testCompile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
testCompile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion"
testCompile 'org.testng:testng:6.13.1'
testCompile "org.mockito:mockito-core:2.8.9"
testCompile "org.powermock:powermock-api-mockito2:1.7.3"
testCompile "org.powermock:powermock-module-testng:1.7.3"
...

【问题讨论】:

    标签: libgdx mockito testng powermock powermockito


    【解决方案1】:

    我已经解决了这个问题。我只是将initGdx(); 移动到重载的beforePowerMockTestMethod()beforePowerMockTestClass() 并删除mockito 注释初始化,因为它在父类中执行。

    固定 AbsTest 类:

    abstract public class AbsTest extends PowerMockTestCase {
    
        protected static void initGdx() {
            // Initialize libgdx headless for use static vars (e.g. Gdx.input.setInputProcessor)
            final HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
            config.renderInterval = 1f / 60; // Likely want 1f/60 for 60 fps
            new HeadlessApplication(mock(Core.class), config);
        }
    
        @BeforeMethod
        @Override
        protected void beforePowerMockTestMethod() throws Exception {
            initGdx();
            super.beforePowerMockTestMethod();
        }
    }
    

    或重载beforePowerMockTestClass方法

    abstract public class AbsTest extends PowerMockTestCase {
    
        protected static void initGdx() {
            // Initialize libgdx headless for use static vars (e.g. Gdx.input.setInputProcessor)
            final HeadlessApplicationConfiguration config = new HeadlessApplicationConfiguration();
            config.renderInterval = 1f / 60; // Likely want 1f/60 for 60 fps
            new HeadlessApplication(mock(Core.class), config);
        }
    
        @BeforeClass
        @Override
        protected void beforePowerMockTestClass() throws Exception {
            super.beforePowerMockTestClass();
            initGdx();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      相关资源
      最近更新 更多