Vov*_*syk 3 java spring unit-testing mocking mockito
例如我有处理程序:
@Component
public class MyHandler {
@AutoWired
private MyDependency myDependency;
@Value("${some.count}")
private int someCount;
public int someMethod(){
if (someCount > 2) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
测试它我写了以下测试:
@RunWith(MockitoJUnitRunner.class}
class MyHandlerTest {
@InjectMocks
MyHandler myHandler;
@Mock
MyDependency myDependency;
@Test
public void testSomeMethod(){
ReflectionTestUtils.setField(myHandler, "someCount", 4);
myHandler.someMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用模拟变量someCount ReflectionTestUtils
.我能以某种方式使用Mockito注释来模拟它吗?
只需使用构造函数注入:
@Component
public class MyHandler {
private MyDependency myDependency;
private int someCount;
@Autowired
public MyHandler(MyDependency myDependency,
@Value("${some.count}") int someCount){
this.myDependency = myDependency;
this.someCount = someCount;
}
public int someMethod(){
if (someCount > 2) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
并且您不需要在测试中使用InjectMocks和反射.您将通过构造函数创建测试对象并传入someCount值.测试期间将忽略注释.
没有内置的方法可以做到这一点,并且要注意@InjectMocks 也有它的缺点:Mockito 的 @InjectMocks 更多的是一种礼貌,而不是一个完全安全的功能,如果被测系统添加任何功能,它会默默地失败字段。
相反,请考虑创建用于测试的构造函数或工厂方法:虽然您的测试代码应该存在于测试中而不是生产类中,但您的测试是类的使用者,您可以为它们显式设计构造函数。
@Component
public class MyHandler {
@AutoWired
private MyDependency myDependency;
@Value("${some.count}")
private int someCount;
/** Visible for testing. */
MyHandler(MyDependency myDependency, int someCount) {
this.myDependency = myDependency;
this.someCount = someCount;
}
// ....
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4591 次 |
最近记录: |