我有很多春季服务用这个autowire:
@Autowired
private SmartCardService smartCardService;
我需要一个虚拟类进行测试,我定义了这个扩展原始类的类:
@Service
public class DummySmartCardService extends SmartCardService{
...
}
如何在不更改所有自动连接注释的情况下确保所有autowire都采用虚拟服务而非原始服务?
感谢。
答案 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的功能进行模拟,验证和间谍是伟大的。