gpt4 book ai didi

java - Spring 3 和 Junit 4 NullPointerException

转载 作者:行者123 更新时间:2023-12-02 04:39:28 24 4
gpt4 key购买 nike

我在设置基于 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,但没有成功。

任何帮助将不胜感激。

好吧 - 我意识到我的描述不够清楚,这是我的第一个问题,无论如何,需要进一步澄清。

我知道上下文配置通常是通过位置配置文件路径或只是简单路径,我已经尝试过这两种方法以及没有路径的默认值。

问题的关键在于 @Contextconfiguration 会触发 NPE,无论提供给它什么,事实上 spring 似乎都没有正确初始化。

我希望这能让事情变得更清楚

最佳答案

Spring 框架引用手册中的大多数示例都明确定义了 XML 文件的位置,或用于填充应用程序上下文的 @Configuration 类。

您可以使用普通的@ContextConfiguration注释,无需任何配置,但默认值可能不是您所期望的:

如果您省略 @ContextConfiguration 注释中的位置和值属性,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...
}

关于java - Spring 3 和 Junit 4 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30343160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com