我是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。
答案 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中所示)。