PowerMock用于测试SocketChannel但抛出异常

时间:2018-04-10 18:38:22

标签: unit-testing testng powermock

我试图对我的套接字服务器代码进行单元测试。我使用Mockito但是当SUT运行到下一行时会爆炸,因为这是最后一种方法。

socketChannel.register()

我是PowerMock的新手,我正在尝试使用它,但无论我尝试什么,我都面临各种问题。如果有人可以帮助审核以下内容并提供一些非常好的帮助。

以下是用于测试的代码。

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.stereotype.Component;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.IObjectFactory;
import org.testng.annotations.ObjectFactory;
import org.testng.annotations.Test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

@ActiveProfiles("QuickTest")
@Component
@ContextConfiguration(classes = AppConfigQuickTest.class)
@PrepareForTest({SocketChannel.class, QuickTest.class})
public class QuickTest extends AbstractTestNGSpringContextTests {
    // An error occurred while instantiating class com.QuickTest: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil
    // Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil
    // at org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:71)
    // at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:60)
    // at com.QuickTest.<clinit>(QuickTest.java:32)
    private static final Logger logger = LogManager.getLogger("QuickTest");

    @ObjectFactory
    public IObjectFactory getObjectFactory() {
        return new org.powermock.modules.testng.PowerMockObjectFactory();
    }

    @Test
    public void socketTest() throws IOException {
        int bytesWritten = 5;
        SocketChannel socketChannel = PowerMockito.mock(SocketChannel.class);
        SocketAddress socketAddress = new InetSocketAddress("abc.com", 12340);
        Mockito.when(socketChannel.getRemoteAddress()).thenReturn(socketAddress);
        Mockito.when(socketChannel.write((ByteBuffer) Mockito.any())).thenReturn(bytesWritten);
        // todo: socketChannel.register() is causing Mockito to throw null pointer exception because it's a final method
        Mockito.doNothing().when(socketChannel.register(Mockito.any(), Mockito.any()));

        // further stuff down here to setup and do test
    }
}

第一个问题

以下一行出现问题。

private static final Logger logger = LogManager.getLogger("QuickTest");

这是完整的堆栈跟踪。

org.testng.TestNGException: 
An error occurred while instantiating class com.QuickTest: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil
    at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:385)
    at org.testng.internal.ClassHelper.createInstance(ClassHelper.java:285)
    at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:126)
    at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:191)
    at org.testng.TestClass.getInstances(TestClass.java:104)
    at org.testng.TestClass.initTestClassesAndInstances(TestClass.java:90)
    at org.testng.TestClass.init(TestClass.java:82)
    at org.testng.TestClass.<init>(TestClass.java:45)
    at org.testng.TestRunner.initMethods(TestRunner.java:422)
    at org.testng.TestRunner.init(TestRunner.java:252)
    at org.testng.TestRunner.init(TestRunner.java:222)
    at org.testng.TestRunner.<init>(TestRunner.java:163)
    at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:566)
    at org.testng.SuiteRunner.init(SuiteRunner.java:170)
    at org.testng.SuiteRunner.<init>(SuiteRunner.java:117)
    at org.testng.TestNG.createSuiteRunner(TestNG.java:1359)
    at org.testng.TestNG.createSuiteRunners(TestNG.java:1346)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1200)
    at org.testng.TestNG.runSuites(TestNG.java:1124)
    at org.testng.TestNG.run(TestNG.java:1096)
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil
    at org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:71)
    at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:60)
    at com.QuickTest.<clinit>(QuickTest.java:32)
    at sun.misc.Unsafe.ensureClassInitialized(Native Method)
    at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
    at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:156)
    at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1088)
    at java.lang.reflect.Field.getFieldAccessor(Field.java:1069)
    at java.lang.reflect.Field.set(Field.java:764)
    at javassist.util.proxy.ProxyFactory.setField(ProxyFactory.java:526)
    at javassist.util.proxy.ProxyFactory.createClass3(ProxyFactory.java:509)
    at javassist.util.proxy.ProxyFactory.createClass2(ProxyFactory.java:493)
    at javassist.util.proxy.ProxyFactory.createClass1(ProxyFactory.java:429)
    at javassist.util.proxy.ProxyFactory.createClass(ProxyFactory.java:400)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1846)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:810)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:675)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:401)
    at org.powermock.modules.testng.internal.TestClassInstanceFactory.createProxyTestClass(TestClassInstanceFactory.java:91)
    at org.powermock.modules.testng.internal.TestClassInstanceFactory.createTestClass(TestClassInstanceFactory.java:78)
    at org.powermock.modules.testng.internal.TestClassInstanceFactory.create(TestClassInstanceFactory.java:49)
    at org.powermock.modules.testng.internal.PowerMockClassloaderObjectFactory.newInstance(PowerMockClassloaderObjectFactory.java:46)
    at org.powermock.modules.testng.PowerMockObjectFactory.newInstance(PowerMockObjectFactory.java:43)
    at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:373)
    ... 21 more

第二个问题

如果我注释掉记录器,我会得到以下内容。

org.testng.TestNGException: 
An error occurred while instantiating class com.QuickTest: Cannot create a new instance of test class class com.QuickTest
    at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:385)
    at org.testng.internal.ClassHelper.createInstance(ClassHelper.java:285)
    at org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:126)
    at org.testng.internal.ClassImpl.getInstances(ClassImpl.java:191)
    at org.testng.TestClass.getInstances(TestClass.java:104)
    at org.testng.TestClass.initTestClassesAndInstances(TestClass.java:90)
    at org.testng.TestClass.init(TestClass.java:82)
    at org.testng.TestClass.<init>(TestClass.java:45)
    at org.testng.TestRunner.initMethods(TestRunner.java:422)
    at org.testng.TestRunner.init(TestRunner.java:252)
    at org.testng.TestRunner.init(TestRunner.java:222)
    at org.testng.TestRunner.<init>(TestRunner.java:163)
    at org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:566)
    at org.testng.SuiteRunner.init(SuiteRunner.java:170)
    at org.testng.SuiteRunner.<init>(SuiteRunner.java:117)
    at org.testng.TestNG.createSuiteRunner(TestNG.java:1359)
    at org.testng.TestNG.createSuiteRunners(TestNG.java:1346)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1200)
    at org.testng.TestNG.runSuites(TestNG.java:1124)
    at org.testng.TestNG.run(TestNG.java:1096)
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Caused by: java.lang.RuntimeException: Cannot create a new instance of test class class com.QuickTest
    at org.powermock.modules.testng.internal.TestClassInstanceFactory.create(TestClassInstanceFactory.java:59)
    at org.powermock.modules.testng.internal.PowerMockClassloaderObjectFactory.newInstance(PowerMockClassloaderObjectFactory.java:46)
    at org.powermock.modules.testng.PowerMockObjectFactory.newInstance(PowerMockObjectFactory.java:43)
    at org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:373)
    ... 21 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.powermock.modules.testng.internal.TestClassInstanceFactory.create(TestClassInstanceFactory.java:51)
    ... 24 more
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil
    at org.apache.logging.log4j.status.StatusLogger.<clinit>(StatusLogger.java:71)
    at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:60)
    at org.apache.commons.logging.LogFactory$Log4jLog.<clinit>(LogFactory.java:199)
    at org.apache.commons.logging.LogFactory$Log4jDelegate.createLog(LogFactory.java:166)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:109)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:99)
    at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.<init>(AbstractTestNGSpringContextTests.java:92)
    at com.QuickTest.<init>(QuickTest.java:26)
    at com.QuickTest_$$_jvst738_0.<init>(QuickTest_$$_jvst738_0.java)
    ... 29 more

第三个问题

如果我删除了&#39; extends AbstractTestNGSpringContextTests&#39;在课堂上我仍然得到以下内容。在这一点上,我不确定我还能尝试什么。

java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
    at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:74)
    at com.sun.proxy.$Proxy13.getHandler(Unknown Source)
    at org.mockito.internal.util.MockUtil.isMock(MockUtil.java:81)
    at org.mockito.internal.configuration.injection.scanner.MockScanner.isMockOrSpy(MockScanner.java:83)
    at org.mockito.internal.configuration.injection.scanner.MockScanner.preparedMock(MockScanner.java:71)
    at org.mockito.internal.configuration.injection.scanner.MockScanner.scan(MockScanner.java:59)
    at org.mockito.internal.configuration.injection.scanner.MockScanner.addPreparedMocks(MockScanner.java:45)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.injectMocks(InjectingAnnotationEngine.java:82)
    at org.powermock.api.mockito.internal.configuration.PowerMockitoInjectingAnnotationEngine.process(PowerMockitoInjectingAnnotationEngine.java:36)
    at org.powermock.api.extension.listener.AnnotationEnabler.injectSpiesAndInjectToSetters(AnnotationEnabler.java:61)
    at org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:56)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1846)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:700)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:415)
    at org.powermock.modules.testng.internal.PowerMockTestNGMethodHandler.injectMocksUsingAnnotationEnabler(PowerMockTestNGMethodHandler.java:76)
    at org.powermock.modules.testng.internal.PowerMockTestNGMethodHandler.invoke(PowerMockTestNGMethodHandler.java:48)
    at com.QuickTest_$$_jvst2c0_0.setup(QuickTest_$$_jvst2c0_0.java)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1284)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1209)
    at org.testng.TestNG.runSuites(TestNG.java:1124)
    at org.testng.TestNG.run(TestNG.java:1096)
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Caused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker implementation declared in sun.misc.CompoundEnumeration@6302bbb1
    at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.java:54)
    at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:57)
    at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.java:44)
    at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.java:21)
    at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.java:18)
    at org.mockito.internal.util.MockUtil.<clinit>(MockUtil.java:24)
    ... 44 more
Caused by: java.lang.ClassCastException: Cannot cast org.powermock.api.mockito.mockmaker.PowerMockMaker to org.mockito.plugins.MockMaker
    at java.lang.Class.cast(Class.java:3369)
    at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.java:50)
    ... 49 more

0 个答案:

没有答案