2013-07-25 44 views
6

我是一位Spring新手,他正在开发一个基于Spring的大型项目,该项目在Spring bean之间有着广泛的联系。我正在尝试编写一些集成测试,以测试整个应用程序功能的子集。为此,我想重写一些自动装配。 例如,假设我有一个类如何覆盖Spring @Autowire注解并将字段设置为null?

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

,并与上下文文件:

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

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

我试着这样做:

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

这是行不通的。 IntelliJ通知我“无法解析属性notNeededForMyDataServiceTest'”,显然是因为该字段没有getter和setter。

我使用Spring框架3.1.3。

+0

您是否尝试过:,我认为这会给你一个字符串null,但你至少可以设置一个值 – Jayz

回答

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... 
} 
3

这些可以帮助:

和配置文件:

你可以创建一个XML配置不同Bean的定义,然后将它们使用-Dspring.profiles.active="profile1,profile2" ENV激活。

+0

漂亮的链接,完全符合要求 – Jayz

+0

感谢三分球!我给安倍奖金,因为他提供了一个代码示例。 – kc2001

3

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

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

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

@Autowired(required = false) 
NotNeededForMyDataServiceTest someOptionalDependency; 

这种方法唯一的缺点是,容器将永远不会在运行时抱怨,如果没有什么在这一领域注入(也许当您的代码在生产环境中运行时,您会希望进行完整性检查)。


如果你不想让这种依赖可选的(或您无法编辑某些原因,代码),你需要通过设置明确提供该字段的模拟/ null值在你的情况下。一个选择是使用Java配置而不是XML(比如@ Abe的答案),另一种方法是使用返回null(如this question)的工厂bean。

+0

感谢您的回复。不幸的是,你是对的 - 我们确实希望在生产中进行理智检查。 – kc2001

+0

我编辑了我的答案,以提供一些替代方案... –

+0

谢谢!我想分开你的答案和安倍晋三之间的奖金,但我不能。我给安倍奖金,因为他提供了一个代码示例。 – kc2001

相关问题