【发布时间】:2015-05-20 07:36:02
【问题描述】:
我在设置基于 Spring 3 和 Junit 4 的单元测试时遇到问题
我的代码目前相当基本,如下所示
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class PSTemplateDAOTests {
private static final Logger logger = Logger.getLogger(
PSTemplateDAOTests.class.getName());
@Autowired
ApplicationContext ctx;
@Test
public void testone ()
{
logger.info("Run testone");
}
@Test
public void testtwo ()
{
logger.info("Run testtwo");
}
}
但是,当我开始运行它时,我遇到了如下的 NPE:-
java.lang.NullPointerException
at org.springframework.test.context.ContextLoaderUtils.resolveContextLoaderClass(ContextLoaderUtils.java:153)
at org.springframework.test.context.ContextLoaderUtils.resolveContextLoader(ContextLoaderUtils.java:84)
at org.springframework.test.context.ContextLoaderUtils.buildMergedContextConfiguration(ContextLoaderUtils.java:298)
at org.springframework.test.context.TestContext.<init>(TestContext.java:100)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:117)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:119)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:108)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
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)
如果我注释掉 @ContextConfiguration 注释,测试将运行,但是我会遇到以下情况:-
May 20, 2015 8:28:29 AM org.springframework.test.context.TestContext <init>
INFO: @ContextConfiguration not found for class [class uk.gov.moj.ps.dao.PSTemplateDAOTests]
May 20, 2015 8:28:29 AM org.springframework.test.context.TestContextManager retrieveTestExecutionListeners
INFO: @TestExecutionListeners is not present for class [class uk.gov.moj.ps.dao.PSTemplateDAOTests]: using defaults.
2015-05-20 08:28:29 INFO PSTemplateDAOTests:34 - Run testtwo
2015-05-20 08:28:29 INFO PSTemplateDAOTests:27 - Run testone
这是有道理的,因为没有允许 Spring 设置环境的 ContextConfiguration 元素。
我还尝试了不同的 ContextConfiguration 设置,包括普通文件和位置元素,这两种设置都没有超过最初的 NPE 错误。
我正在使用 Eclipse Kepler 和 jre 1.7,尽管我也切换了 jre,但没有任何成功。
任何帮助将不胜感激。
好的 - 我意识到我的描述不够清楚,这是我关于 SO 的第一个问题,无论如何需要进一步澄清。
我知道上下文配置通常通过位置或简单路径配置文件路径,我已经尝试了这两种方法以及没有路径的默认值。
问题的关键在于@Contextconfiguration 会触发 NPE,而不管提供给它的是什么,实际上 spring 甚至似乎都没有正确初始化。
我希望这能让事情更清楚
【问题讨论】:
-
你如何配置你的上下文配置?使用 xml 文件或注解?
-
您不需要将@ContextConfiguration 指向它所在的位置吗?示例:@ContextConfiguration(locations = { "/META-INF/spring/applicationContext.xml" })