【问题标题】:Why is my bean null?为什么我的 bean 为空?
【发布时间】:2010-11-17 18:10:00
【问题描述】:

我正在尝试学习如何使用 applicationContext。我的目标是在使用我的单元测试时将模拟数据存储库换成真实的。我不想明确地这样做,我想通过依赖注入来做到这一点。

因此,在我把事情复杂化之前,作为一个简单的测试,我只是想从我的 applicationContext.xml 中获取一个 bean。根据我的阅读,这应该可行:

@ContextConfiguration(locations = "/applicationContext.xml")
public class ResultsListTests {

     @Resource
     CompanyResult resultBean;

     @Test
     public void shouldAddResults() {
         assertEquals(resultBean.getCompanyName(), "Microsoft");

但我的 resultBean 始终为空。这是我的 applicationContext.xml,它位于 WebContent/WEB-INF 下:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="resultBean" name="resultBean" class="com.trgr.cobalt.company.domain.CompanyResult">
        <property name="companyName">
            <value>Microsoft</value>
        </property>
     </bean>
</beans>

那么为什么我的 resultBean 总是 null 呢?我做错了什么?

【问题讨论】:

    标签: spring dependency-injection javabeans spring-test


    【解决方案1】:

    您缺少@RunWith(SpringJUnit4ClassRunner.class) 注释:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "/applicationContext.xml")
    public class ResultsListTests {
    
         @Resource
         CompanyResult resultBean;
    
         @Test
         public void shouldAddResults() {
             assertEquals(resultBean.getCompanyName(), "Microsoft");
         }
    }
    

    顺便说一句,在您的示例中,WebContent/WEB-INF 不是applicationContext.xml 的正确位置。

    如果您指定 @ContextConfiguration(locations = "/applicationContext.xml"),那么 Spring 将在类路径的根目录中查找 applicationContext.xml,而不是在 WebContent/WEB-INF 中(jUnit 100% 不知道这是一个 Web 应用程序这一事实)。

    有关详细信息,请参阅Spring reference documentation

    【讨论】:

    • 感谢您的回复。两个问题。 1) SpringJUnit4ClassRunner 无法解析为类型。那是怎么回事? 2)虽然知道我的 applicationContext.xml 位于错误的位置会很有帮助,但知道放置它的正确位置会更有帮助(“类路径的根”对我来说意义不大,因为我对 Spring 和 Java 很陌生)。我已经阅读了关于 BeanFactory 和 ApplicationContext 的章节,显然他们希望你知道它的去向。
    • 您使用的是什么版本的 Spring?您的项目是如何组织的(源文件夹布局)?
    • 我使用的是 3.0.5。我的 Java 资源包含一个 src 文件夹和一些测试文件夹。我的 src 文件夹只有包。有人告诉我应该在 Java Resources 下添加一个资源文件夹并将我的 applicationContext.xml 放在那里,然后我可以使用 WEB-INF/classes/applicationContext.xml 引用它。我不清楚 Java 资源/资源如何映射到 WEB-INF/类,但这并不是我第一次对 Java 在文件夹结构方面坚持雾里看花感到沮丧。无论如何,您同意这一点还是有不同的建议?
    • 我不确定我之前做错了什么,但是我的 @RunWith 注释现在可以正常工作并且我的 applicationContext 正在加载。感谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2013-09-28
    • 2014-06-23
    • 2016-09-04
    • 2018-06-26
    • 2010-11-25
    • 2018-04-07
    相关资源
    最近更新 更多