使用JMockIt时c3p0初始化失败

时间:2013-11-16 09:58:00

标签: junit4 c3p0 jmockit

今天遇到一个奇怪的人。 一些背景:基本上我正在为REST服务实现编写一个测试用例(jUnit 4.10)。 数据层使用Hibernate3(喜欢那些遗留项目),使用c3p0连接池。 所有这些都很好。

但是,现在对于REST服务,我正在尝试使用JMockIt来模拟HttpServletRequest(不要问)。 我之前使用过JMockIt,并喜欢它。

对,所以:问题: 如果我在类路径BEFORE JMockIt上使用JUnit运行测试用例(使用Netbeans btw),JMockIt会抱怨,并且告诉我它必须在Junit之前的类路径上。

好的,我这样做。

但是,然后c3p0初始化突然失败并出现NullPointerException(我将堆栈跟踪粘贴在底部)。

如果我再次切换类路径lib命令,我们就会回到我们开始的地方。

我现在不想尝试不同的模拟库,这是周六的ffs。此外,这感觉就像一个非常愚蠢的问题......

有人遇到过这样的事情,或者有些想法吗?

谢谢!

承诺的堆栈跟踪:

    [16-11-2013 11:46:37:037 CAT] ERROR hibernate.connection.C3P0ConnectionProvider:184 - could not instantiate C3P0 connection pool
java.lang.NullPointerException
    at java.util.Hashtable.put(Hashtable.java:542)
    at com.mchange.v2.c3p0.DataSources.pooledDataSource(DataSources.java:327)
    at org.hibernate.connection.C3P0ConnectionProvider.configure(C3P0ConnectionProvider.java:181)
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:143)
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:84)
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:459)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:90)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2863)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2859)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1870)
    at za.co.afrigis.doi.hibernate.HibernateSession.init(HibernateSession.java:31)
    at za.co.afrigis.doi.mtn.MtnDoiManager.<init>(MtnDoiManager.java:72)
    at za.co.afrigis.doi.MTNDoiManagerTest.setUpClass(MTNDoiManagerTest.java:48)
    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.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at mockit.integration.junit4.internal.JUnit4TestRunnerDecorator.invokeExplosively(JUnit4TestRunnerDecorator.java:44)
    at mockit.integration.junit4.internal.MockFrameworkMethod.invokeExplosively(MockFrameworkMethod.java:29)
    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 mockit.internal.util.MethodReflection.invokeWithCheckedThrows(MethodReflection.java:95)
    at mockit.internal.mockups.MockMethodBridge.callMock(MockMethodBridge.java:75)
    at mockit.internal.mockups.MockMethodBridge.invoke(MockMethodBridge.java:41)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:39)
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:520)
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1060)
    at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:911)

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。我正在使用jmockit v1.5并进行了测试,该测试与测试数据库中的一些夹具数据进行了对话。深入研究jmockit源代码,我注意到了mockit.internal.startup.Startup中的代码。

Properties properties = System.getProperties();
properties.put("jmockit-instrumentation", inst);

显然,inst在某些情况下为空,这会导致原始帖子中提到的c3p0下游的NPE。我没有弄清楚为什么inst为null,但是当我升级到jmockit v1.7时,我注意到库不再尝试以这种方式修改系统道具,而且确定我的“单元”测试(它可能不应该'触摸数据库)现在正在运作。

更短的答案:尝试使用jmockit v1.7或更新版本。