如何覆盖Spring @Autowire注释并将字段设置为null?

时间:2013-07-25 18:31:05

标签: spring

我是Spring新手,正在开发一个基于Spring的大型项目,该项目在Spring bean之间有广泛的耦合。我正在尝试编写一些集成测试来执行整个应用程序功能的子集。为此,我想覆盖一些自动装配。 例如,假设我有一个类

public class MyDataServiceImpl implements MyDataService {
    @Qualifier("notNeededForMyDataServiceTest")
    @Autowired
    private NotNeededForMyDataServiceTest notNeededForMyDataServiceTest;
    //...
}

和上下文文件:

<bean id="myDataService"
      class="MyDataServiceImpl">
</bean>

在我的测试中,我无需使用notNeededForMyDataServiceTest字段。有没有什么方法可以覆盖@Autowired注释并将notNeededForMyDataServiceTest设置为null,可能在XML文件中?我不想修改任何Java类,但我确实想避免notNeededForMyDataServiceTest的(有问题的)配置。

我尝试过:

<bean id="myDataService"
      class="MyDataServiceImpl">
    <property name="notNeededForMyDataServiceTest"><null/></property>
</bean>

这不起作用。 IntelliJ告诉我“无法解析属性'notNeededForMyDataServiceTest'”,显然是因为该字段没有getter和setter。

我正在使用Spring Framework 3.1.3。

3 个答案:

答案 0 :(得分:5)

以下配置应该可行,我冒昧地在Java配置中混合

@Configuration
//This will load your beans from whichever xml file you are using
@ImportResource("classpath:/path/beans.xml")
public class TestConfigLoader{
    // This will declare the unused bean and inject MyDataServiceImpl with null.
    public @Bean(name="notNeededForMyDataServiceTest") NotNeededForMyDataServiceTest getNotNeededForMyDataServiceTest(){
        return null;
    }
... any other configuration beans if required.
}

并注释你的测试类:

// In your test class applicationContext will be loaded from TestConfigLoader
@ContextConfiguration(classes = {TestConfigLoader.class})
public class MyTest {
    // class body...
}

答案 1 :(得分:3)

这些可能会有所帮助:

和个人资料:

您可以在XML配置中创建不同的bean定义,然后使用-Dspring.profiles.active="profile1,profile2" env激活它们。

答案 2 :(得分:3)

您使用的@Autowired机制错误。限定符是您需要设置的属性。这实际上是bean的名称,因此如果在同一个上下文中定义了多个相同类型的bean,容器将能够选择一个特定的实例。

因此容器将查找类型为NotNeededForMyDataServiceTest的bean和名称(实际上是XML中的bean id):notNeededForMyDataServiceTest

我认为你想要的是如果在应用程序上下文中没有定义NotNeededForMyDataServiceTest类型的bean,则指示容器不在该字段中注入任何内容。只需将注释的required属性设置为false

即可实现这一点
@Autowired(required = false)
NotNeededForMyDataServiceTest someOptionalDependency;

这种方法的唯一缺点是,如果在该字段中没有任何内容可以注入,容器将永远不会在运行时抱怨(并且当代码在生产中运行时,您可能希望进行这种健全性检查。)


如果您不希望将该依赖项设置为可选(或者由于某种原因无法编辑该代码),则需要通过明确设置该字段为该字段提供模拟/ null值在你的背景下。这样做的一个选择是使用Java配置而不是XML(如@Abe的答案),另一种方法是使用返回null的工厂bean(如this question中所示)。