gpt4 book ai didi

java - 不模拟方法,而是调用原始方法(mockito)

转载 作者:行者123 更新时间:2023-12-02 11:40:20 25 4
gpt4 key购买 nike

我想测试这个类..

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 类的原始方法,而不是调用模拟的方法。我通过将 Sysout 放入 checkNumbers.check() 方法中来了解这一点。

任何人都可以强调一下我在哪里犯了错误。

最佳答案

checkNumbers 是在 add 方法内部创建的...

checkNumbers checkobj=new checkNumbers();

Mockito 注入(inject)功能 (@InjectMocks) 无法为您填充此内容。

为了让 Mockito 将 checkNumbers 设置为模拟,您需要允许它被注入(inject)。

例如:将其移出 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 将尝试通过以下之一注入(inject)模拟(按此顺序):

  1. 构造函数注入(inject)
  2. Setter 注入(inject)
  3. 属性(property)注入(inject)

如果您将 checkNumbers 声明为类成员,则 Mockito 将按照上面的#3 进行注入(inject)。或者,您可以像这样声明一个构造函数...

private checkNumbers checkobj;

public AddNumbers(checkNumbers checkobj) {
this.checkobj = checkobj;
}

...Mockito 将按照上面的 #1 注入(inject)模拟实例。

这样做的好处是使您的类在构造时明确需要任何其他类,并且可以允许您交换 checkNumbers 的不同实现,从而促进由不同形式的 AddNumbers 组成。

更多详情in the Mockito docs .

关于java - 不模拟方法,而是调用原始方法(mockito),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48624240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com