Spring 莫基托不是';无法模拟基元类型
我正在为我的一个验证器编写一个单元测试,该验证器使用整数类型作为Spring 莫基托不是';无法模拟基元类型,spring,unit-testing,mockito,Spring,Unit Testing,Mockito,我正在为我的一个验证器编写一个单元测试,该验证器使用整数类型作为@Autowired依赖项 现在,在编写测试时,我不能像Spring所说的那样@Mock- org.mockito.exceptions.base.MockitoException: Cannot mock/spy class java.lang.Integer Mockito cannot mock/spy following: - final classes - anonymous classes - primit
@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
}
此验证器类的测试如下所示-
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原因无法模拟。为什么不为该属性创建一个setter
此外,您还可以为MyValidator
创建一个构造函数,并在其中插入自动连接属性。这使得测试更加容易
例如:
public class MyValidator {
@Autowired
public MyValidator(Integer intervalInDays, LanguageValidator languageValidator, IdValidator idValidator) {
//Set your global attributes
}
}
如果只是为了测试,我必须提供一个设置器,为什么我要使用自动布线?我给出了两种设置依赖项的方法。首先,您可以使setter-only包可见。其次,它将使您的代码更易于测试。实际上,我从来没有使用过
@InjectMocks
,因为我写的代码是这样的,我可以注入我的属性。第三,您仍然可以使用构造函数。此外,在这里您可以看到许多关于如何注入mock的方法。如果这是唯一的解决方案,请检查这一点,因为它与spring处理其他依赖项的方式不一致。