我在基于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
这是有道理的,因为没有ContextConfiguration元素允许Spring设置环境。
我还尝试了对普通文件和位置元素进行不同的ContextConfiguration设置,这两个设置都没有超出初始NPE错误。
我正在使用Eclipse Kepler和jre 1.7,尽管我也切换了jre,但没有成功。
任何帮助将不胜感激。
好的-我知道我的描述不够清楚,这是我关于SO的第一个问题,无论如何都需要进一步澄清。
我知道,contextconfiguration通常使用通过位置到文件的路径或只是简单路径来配置,我尝试了这两种方法以及没有路径的默认值。
整个问题的关键在于@Contextconfiguration会触发NPE,而不管它提供了什么,实际上spring甚至似乎还没有正确初始化。
我希望这可以使事情变得更清楚
最佳答案
Spring框架参考手册中的大多数示例都明确定义了XML文件或用于填充应用程序上下文的@Configuration
类的位置。
您可以使用简单的@ContextConfiguration
批注,而无需进行任何配置,但是默认值可能不是您期望的:
如果您从@ContextConfiguration批注中省略了location和value属性,则TestContext框架将尝试检测默认的XML资源位置。具体来说,GenericXmlContextLoader根据测试类的名称检测默认位置。如果您的类名为com.example.MyTest,则GenericXmlContextLoader将从“ classpath:/com/example/MyTest-context.xml”加载应用程序上下文。
恕我直言,您应该将应用程序上下文的配置显式传递给@ContextConfiguration
。来自同一文档的示例:
// use test.config.xml from classpath
@ContextConfiguration("/test-config.xml")
public class XmlApplicationContextTests {
// class body...
}
// use TestConfig as a @Configuration class
@ContextConfiguration(classes = TestConfig.class)
public class ConfigClassApplicationContextTests {
// class body...
}