7

我是一名 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。

4

3 回答 3

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...
}
于 2013-08-12T17:24:20.033 回答
3

这些可能会有所帮助:

和简介:

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

于 2013-07-25T18:35:05.153 回答
3

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

所以容器会寻找一个 bean 类型NotNeededForMyDataServiceTest和名字(它实际上是idXML 中的 bean):notNeededForMyDataServiceTest.

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

@Autowired(required = false)
NotNeededForMyDataServiceTest someOptionalDependency;

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


如果您不想将该依赖项设为可选(或者由于某种原因无法编辑该代码),则需要null通过在上下文中显式设置来为该字段提供模拟/值。一种选择是使用 Java 配置而不是 XML(如@Abe 的回答),另一种方法是使用返回的工厂 bean null(如在这个问题中)。

于 2013-08-12T17:38:45.047 回答