我为我的一个使用Integer类型作为@Autowired
依赖项的验证器编写单元测试。
现在,在编写测试时,我无法像Spring所说的那样@Mock
-
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class java.lang.Integer
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
我该如何解决它?
我的验证器看起来像这样 -
public class MyValidator {
@Autowired
@Qualifier(value = "intervalInDays")
private Integer intervalInDays; // does not get mocked!!
@Autowired
private LanguageValidator languageValidator;
@Autowired
private IdValidator idValidator;
public void validate(Request request) {
//does some validations
}
}
此验证器类的测试如下所示 -
@RunWith(MockitoJUnitRunner.class)
public class MyValidatorTest {
@InjectMocks
private MyValidator myValidator; //isnt mocked at all
@Mock
private LanguageValidator languageValidator; //works fine
@Mock
private IdValidator idValidator; //works fine
@Mock(name = "intervalInDays")
private Integer intervalInDays;
//some tests here
}
请建议一个解决方案,因为intervalInDays
未能模仿上述Mockito的原因。
答案 0 :(得分:1)
为什么不为这个属性创建一个setter?
此外,您可以为MyValidator
创建一个构造函数,并在那里注入Autowired属性。这使得测试变得更加容易。
示例:
public class MyValidator {
@Autowired
public MyValidator(Integer intervalInDays, LanguageValidator languageValidator, IdValidator idValidator) {
//Set your global attributes
}
}
Here it's explained why @InjectMock
is not really a good practice.