用于测试的Spring bean autowire

时间:2013-07-15 09:09:16

标签: java spring testing autowired

我有很多春季服务用这个autowire:

@Autowired
private SmartCardService smartCardService;

我需要一个虚拟类进行测试,我定义了这个扩展原始类的类:

@Service
public class DummySmartCardService extends SmartCardService{
    ...
}

如何在不更改所有自动连接注释的情况下确保所有autowire都采用虚拟服务而非原始服务?

感谢。

4 个答案:

答案 0 :(得分:3)

考虑使用@Primary注释。见here

答案 1 :(得分:1)

从应用程序上下文文件的测试版本加载DummySmartCardService bean,以便不需要对测试中的代码进行任何更改

@ContextConfiguration(locations = {"classpath:test-services.xml"})

答案 2 :(得分:0)

使用@Resource注释或@Qualifier,使用@Qualifier来区分bean类型:

@Autowired
@Qualifier("testing")
private SmartCardService smartCardService;

@Service
@Qualifier("testing")
public class DummySmartCardService extends SmartCardService{
    ...
}

或使用@Resource使用按名称语义:

@Resource("dummySmartCardService")
private SmartCardService smartCardService;


@Service("dummySmartCardService")
public class DummySmartCardService extends SmartCardService{
    ...
}

理论上你可以使用@Qualifier("beanName"),但不鼓励它。

但是如果你有一个Spring配置文件只在你的测试中加载测试相关的存根,那么它会更好:

@Service
@Profile("test")
public class DummySmartCardService extends SmartCardService{
    ...
}

@ContextConfiguration(locations = {"classpath:services.xml"})    
@ActiveProfiles("test")
public class TestSuite{
    @Autowired
    private SmartCardService smartCardService;
}

答案 3 :(得分:0)

恕我直言,你应该看看Springockio是否适当而且很容易嘲笑Spring bean。

你可以用模拟替换你的bean,或用这种方式用Spy换行:

@ContextConfiguration(loader = SpringockitoContextLoader.class,
locations = "classpath:/context.xml")
public class SpringockitoAnnotationsMocksIntegrationTest extends 
                                AbstractJUnit4SpringContextTests {

    @ReplaceWithMock
    @Autowired
    private InnerBean innerBean;

    @WrapWithSpy
    @Autowired
    private AnotherInnerBean anotherInnerBean;
    ....
}

这不仅是一种干净的方式(需要通过添加限定符或配置文件来更改正在测试的代码),还允许您使用Mockito的功能进行模拟,验证和间谍是伟大的。