【发布时间】:2015-01-29 06:41:28
【问题描述】:
我在我的项目中使用Mockito+TestNG 框架。它以前可以正常工作,但是为了模拟一些静态方法,我在类路径中注入了 PowerMock Libraries 并更新了代码以使用 PowerMock。
我发现每当我尝试执行时:
PowerMockito.doNothing().when(CustomImportUtil.class, "init", serviceMgr);
初始化mockobject [s = mock(Service.class);] 时测试用例失败,并显示错误消息:
java.lang.ExceptionInInitializerError
at org.mockito.internal.exceptions.stacktrace.ConditionalStackTraceFilter.<init>(ConditionalStackTraceFilter.java:17)
at org.mockito.exceptions.base.MockitoException.filterStackTrace(MockitoException.java:30)
at org.mockito.exceptions.base.MockitoException.<init>(MockitoException.java:19)
at org.mockito.exceptions.misusing.MockitoConfigurationException.<init>(MockitoConfigurationException.java:18)
at org.mockito.internal.configuration.ClassPathLoader.loadImplementations(ClassPathLoader.java:145)
at org.mockito.internal.configuration.ClassPathLoader.findPluginImplementation(ClassPathLoader.java:110)
at org.mockito.internal.configuration.ClassPathLoader.findPlatformMockMaker(ClassPathLoader.java:106)
at org.mockito.internal.configuration.ClassPathLoader.<clinit>(ClassPathLoader.java:59)
at org.mockito.internal.configuration.GlobalConfiguration.createConfig(GlobalConfiguration.java:38)
at org.mockito.internal.configuration.GlobalConfiguration.<init>(GlobalConfiguration.java:32)
at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:94)
at com.facetime.imcoreserver.importer.facetime.collaboration.CVImporterTestCase.beforeMethod(CVImporterTestCase.java:93)
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:597)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:564)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:213)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:653)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
at org.testng.TestNG.run(TestNG.java:1057)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Caused by: java.lang.NullPointerException
at org.mockito.internal.exceptions.stacktrace.StackTraceFilter.<clinit>(StackTraceFilter.java:21)
... 38 more
下面是我的示例 java 测试类。请帮我解决这个问题。
package com.facetime.imcoreserver.importer.facetime.collaboration;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.internal.verification.Times;
//import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.Assert;
import org.testng.IObjectFactory;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.ObjectFactory;
import org.testng.annotations.Test;
import com.actiance.coreserver.frameWork.CustomImportUtil;
import com.facetime.ftcore.service.Service;
@PrepareForTest(CustomImportUtil.class)
public class MyTestCase extends PowerMockTestCase{
MYImporter importer = null;
Service s = null;
String importerName = "MYImporter";
String fileLocation = "Location";
int networkId = 2;
int companyId = -1;
int importerNum = 1;
int serverId = 1;
private IMNetworkConnectorInfo networkConnectorInfo = null;
private IMAuditNetworkRegistrationDBMgr networkRegistrationDBMgr = null;
public void initialization() {
System.out.println("nitesh");
}
@BeforeMethod(groups = { "import" })
public void beforeMethod(){
s = mock(Service.class);
PowerMockito.mockStatic( CustomImportUtil.class);
}
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new org.powermock.modules.testng.PowerMockObjectFactory();
}
@Test(groups = { "import" })
public void testMYImporterConstructorCaseCustomPropsAreEmpty(){
mockMYImporter();
mockInitCustomImport(configProperties, libProperties);
boolean exCaught = false;
try {
importer = new MYImporter(s, importerNum, companyId, 0);
} catch (CVImportConfigException e2) {
exCaught = true;
}
Assert.assertNull(importer, "MYImporter object should be null");
}
private void mockMYImporter(){
when(s.service(FTServiceMgr.class)).thenReturn(serviceMgr);
try {
//PowerMockito.spy(CustomImportUtil.class);
//PowerMockito.doNothing().when(CustomImportUtil.class);
PowerMockito.doNothing().when(CustomImportUtil.class, "init", serviceMgr);
} catch (Exception e) {
}
}
}
我的模拟和测试库是:
- powermock-mockito-1.5.3-full.jar
- powermock-module-testng-agent-1.6.1.jar
- mockito-all-1.9.5.jar
- testng-6.8.7.jar
- objenesis-2.1.jar
- javassist-3.18.1-GA.jar
- cglib-nodep-2.2.2.jar
- bsh-2.0b4.jar
- hamcrest-core-1.1.jar
- jcommander-1.27.jar
- snakeyaml-1.12.jar
请帮忙。
【问题讨论】:
-
谷歌搜索给了我这个相关的问题:code.google.com/p/powermock/issues/detail?id=414
-
PowerMock 的操作需要自定义类加载器,在某些情况下,人们可能无法理解正在发生的事情。我个人的经验是:在使用 PowerMock 努力让 Log4J 工作之后,我致力于支付成本并重构我的代码,以便 Mockito 就足够了。
标签: java testng mockito powermock