[英]Not mocking methods, instead calls original methods (mockito)
我要测试的课程。
public class AddNumbers {
public int add(int a, int b){
checkNumbers checkobj=new checkNumbers();
boolean flg = checkobj.check(a, b);
if(flg == true){
return a+b;
}else{
return 0;
}
}
}
这是单元测试用例...
@RunWith(MockitoJUnitRunner.class)
public class AddNumbersTest {
@Mock
checkNumbers checkobj;
@InjectMocks
AddNumbers addobj = new AddNumbers();
@Test
public void testAdd1(){
int a=10;
int b=5;
Mockito.when(checkobj.check(a, b)).thenReturn(true);
assertEquals(addobj.add(a,b),15);
}
}
当我运行此测试用例时,它将调用checkNumbers
类的原始方法,而不是调用checkNumbers
方法。 我通过将Sysout
放在checkNumbers.check()
方法中来了解这一点。
谁能强调我在哪里做错了。
checkNumbers
是内部创建add
的方法...
checkNumbers checkobj=new checkNumbers();
Mockito注入功能( @InjectMocks
)不能为您填充此功能。
为了让Mockito将checkNumbers
设置为模拟,您需要允许它被注入。
例如:将其移出add()
并将其声明为类成员:
private checkNumbers checkobj;
public int add(int a, int b){
boolean flg = checkobj.check(a, b);
if(flg == true){
return a+b;
}else{
return 0;
}
}
当受到@InjectMocks
批注的指示时,Mockito将尝试通过以下一种方式注入模拟:
如果您将checkNumbers
声明为类成员,则Mockito将按照上面的#3进行注入。 另外,您可以像这样声明一个构造函数...
private checkNumbers checkobj;
public AddNumbers(checkNumbers checkobj) {
this.checkobj = checkobj;
}
...,然后Mockito将按照上面的#1注入模拟实例。
这将具有使您的类在构造时明确需要的任何其他类的好处,并且可以允许您交换checkNumbers
不同实现,从而有助于组成不同形式的AddNumbers
。
在Mockito文档中有更多详细信息。
@glytching的先前答案是绝对正确的。
这是覆盖吸气方法的其他可能解决方案。
public class AddNumbers {
// This is new method to return a new instance of checkNumbers.
checkNumbers getCheckNumbers() {
return new checkNumbers();
}
public int add(int a, int b){
checkNumbers checkobj = getCheckNumbers();
// do what you need
}
}
您测试覆盖了getCheckNumbers():
@RunWith(MockitoJUnitRunner.class)
public class AddNumbersTest {
@Mock
checkNumbers checkobj;
@InjectMocks
AddNumbers addobj = new AddNumbers() {
@Override
checkNumbers getCheckNumbers() {
return checkobj;
}
};
@Test
public void testAdd1(){
int a=10;
int b=5;
Mockito.when(checkobj.check(a, b)).thenReturn(true);
assertEquals(addobj.add(a,b),15);
}
}
关于您的代码的一般说明:
CheckNumbers
。 flg
> flag
。 if(flg == true)
可以简化为if(flg)
if/esle
构造可以简化为一种解决方案: return flag ? a + b : 0
return flag ? a + b : 0
testAdd1
> addShouldSumTwoGivenIntegers()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.