@ReplaceWithMock和@Qualifier

fas*_*ser 7 java integration-testing unit-testing spring-mvc springockito

我正在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;
    }
Run Code Online (Sandbox Code Playgroud)

在测试中,我将使用@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;

}
Run Code Online (Sandbox Code Playgroud)

在最后一种情况下,在初始化上下文后,只有DateCalculator和Accessor bean正确地替换了所需的模拟,但另一个bean自动装配为主要上下文中的普通bean.

调试后我发现QualifierAnnotationAutowireCandidateResolver无法正确识别bean.在从229开始的下面的行中:

RootBeanDefinition bd = (RootBeanDefinition) bdHolder.getBeanDefinition();
AutowireCandidateQualifier qualifier = bd.getQualifier(type.getName());
Run Code Online (Sandbox Code Playgroud)

Spring试图从模拟依赖中提取限定符,但它是空的.

很高兴知道我如何正确地将@Qualifier的依赖替换为mock对象.

Art*_*tem 0

你不需要再这样做了。Mockito 本身从版本 1.8.3 开始现在支持带注释的模拟和模拟注入,如下所述:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Mockito.html#21

我们现在对单元测试执行以下操作:

// No annotation required
public class SomeTest {

  @Mock
  private SomeDependency someDependency;
  @Mock
  private SomeDependency2 someDependency2;
  @InjectMocks
  private ClassUnderTest classUnderTest;

  @BeforeMethod(alwaysRun = true)
  public void setUp() {
    MockitoAnnotations.initMocks(this);
  }

  public void testSomething() {
    // Do your Mockito test here.
  }
}
Run Code Online (Sandbox Code Playgroud)