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对象.
你不需要再这样做了。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)
| 归档时间: |
|
| 查看次数: |
4040 次 |
| 最近记录: |