gpt4 book ai didi

java - 运行测试用例时Spring依赖注入(inject)null

转载 作者:行者123 更新时间:2023-12-04 05:37:16 25 4
gpt4 key购买 nike

我正在使用 Spring 3.0 和 jUnit 4.8,并且正在尝试开发一些单元测试。

实际上,我只是尝试在 jUnit 使用的应用程序上下文中加载的 XML 中定义的测试用例中使用依赖注入(inject)设置 bean 的属性(文件)。

我正在使用使用 jUnit 4 方法的注释加载的 XML 文件配置。这是所有测试类使用的主要 BaseTest:

@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@Ignore
public class BaseTest { ... }

这是 test-context.xml的一部分
<context:component-scan base-package="com.test" />  

<bean id="ExtractorTest" class="com.test.service.ExtractorTest">
<property name="file" value="classpath:xls/SimpleFile.xls"></property>
</bean>

所以我试图在我的类里面做的测试( ExtractorTest )只是用类路径中加载的文件设置'file'属性,没有别的。

这是包含测试的类(class)的一部分:
public class ExtractorTest extends BaseTest {

private Resource file;
private InputStream is;

public void setFile(Resource file) {
this.file = file;
}

@Before
public void init() {
this.is = this.getClass().getResourceAsStream("/xls/SimpleFile.xls");
Assert.assertNotNull(is);
}

@Test
public void testLoadExcel() throws IOException {
// file is always null, but the InputStream (is) isn't!
Assert.assertNotNull(file.getFile());
InputStream is = new FileInputStream(file.getFile());
HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(is));
// todo...
}

}

问题是 setter 可以工作,因为我添加了一个断点并且 Spring 正在设置它的属性。但是当测试方法启动时它是空的,可能是因为它是另一个正在运行的实例,但是为什么呢?如何使用应用程序上下文的 XML 设置要加载的"file"以进行测试?我无法使用 jUnit 分配它,我不明白为什么以及如何去做。我试图避免在 @Before 方法中写入,但我不知道这绝对是一个好方法......

谢谢你。

PD:对不起我的英语;-)

最佳答案

您的配置不起作用,因为 Spring 没有创建 ExtractorTest 的实例JUnit 使用哪个;相反,该实例由 JUnit 创建,然后传递给 Spring 进行后期处理。

您看到的效果是因为应用程序上下文创建了一个 id 为 ExtractorTest 的 bean。但没有人使用它。

伪代码:

ApplicationContect appContext = new ...
appContext.defineBean("ExtractorTest", new ExtractorTest()); // Calls setter

ExtractorTest test = new ExtractorTest(); // Doesn't call setter
test.postProcess(appContext); // inject beans from appContext -> does nothing in your case

所以解决办法是定义一个bean file :
<bean id="file" class="..." />

(参见文档如何构建 Resource bean)然后让 Spring 注入(inject):
@Autowired
private Resource file;

关于java - 运行测试用例时Spring依赖注入(inject)null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11776847/

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