2

我有很多使用这个自动装配线的弹簧服务:

@Autowired
private SmartCardService smartCardService;

我需要一个用于测试的虚拟类,并且我定义了这个类来扩展原始类:

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

在不更改所有 Autowired 注释的情况下,如何确保所有 autowire 都将采用虚拟服务而不是原始服务?

谢谢。

4

4 回答 4

4

考虑使用 @Primary 注释。看这里

于 2013-07-15T09:15:19.133 回答
1

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

@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;
}
于 2013-07-15T09:17:18.923 回答
1

而是从应用程序上下文文件的测试版本加载DummySmartCardServicebean,这样就无需更改被测代码

@ContextConfiguration(locations = {"classpath:test-services.xml"})
于 2013-07-15T09:15:55.857 回答
0

恕我直言,您应该看看Springockio以正确且相当容易地模拟 Spring bean。

您可以通过以下方式将 bean 替换为 mock 或使用 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的功能进行模拟、验证和监视,这非常棒。

于 2013-07-15T17:53:22.277 回答