【发布时间】:2014-09-25 07:04:44
【问题描述】:
我正在使用springockito-annotations 1.0.9 进行集成测试。
我有以下控制器:
@Autowired
public Controller(
@Qualifier("passwordService ") PasswordService passwordService ,
@Qualifier("validator") Validator validator,
@Qualifier("reportService") ReportService reportService,
DateCalculator dateCalculator,
Accessor accessor){
this.passwordService = passwordService;
this.validator = validator;
this.reportService = reportService;
this.dateCalculator = dateCalculator;
this.accessor = accessor;
}
在测试中,我将使用 @ReplaceWithMock 注释从上下文中替换 bean。
但不幸的是,它仅适用于依赖项没有@Qualifier注释。
也就是说,我的测试是这样的:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(loader = SpringockitoAnnotatedContextLoader.class, classes = {TestContext.class})
public class ControllerTest {
@Autowired
@ReplaceWithMock
private PasswordService passwordService ;
@Autowired
@ReplaceWithMock
private Validator validator;
@Autowired
@ReplaceWithMock
private ReportService reportService;
@Autowired
@ReplaceWithMock
private DateCalculator dateCalculator;
@Autowired
@ReplaceWithMock
private Accessor accessor;
@Autowired
private Controller controller;
}
在初始化上下文后的最后一种情况下,只有 DateCalculator 和 Accessor bean 正确替换为所需的模拟,但另一个 bean 自动装配为来自主上下文的普通 bean。
调试后发现 QualifierAnnotationAutowireCandidateResolver 无法正确识别 bean。在以下从 229 开始的行中:
RootBeanDefinition bd = (RootBeanDefinition) bdHolder.getBeanDefinition();
AutowireCandidateQualifier qualifier = bd.getQualifier(type.getName());
Spring 尝试从 mocked 依赖项 中提取限定符,但它是空的。
很高兴知道如何正确地将依赖项替换为 @Qualifier 来模拟对象。
【问题讨论】:
-
在控制器类中添加“@Autowired”和“@Qualifier”可能会对您有所帮助
标签: java unit-testing spring-mvc integration-testing springockito