Я использую 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.
Но, к сожалению, это работает только для зависимостей без аннотации @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 and Accessor корректно заменяются необходимыми макетами, но другой компонент автоматически подключается как обычный компонент из основного контекста.
После отладки я обнаружил, что QualifierAnnotationAutowireCandidateResolver не может правильно идентифицировать bean-компонент. В строках ниже, начиная с 229:
RootBeanDefinition bd = (RootBeanDefinition) bdHolder.getBeanDefinition();
AutowireCandidateQualifier qualifier = bd.getQualifier(type.getName());
Spring попытался извлечь квалификатор из фиктивной зависимости, но он пуст.
Будет полезно узнать, как я могу правильно заменить зависимость на @Qualifier, чтобы имитировать объект.