繁体   English   中英

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

[英]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将尝试通过以下一种方式注入模拟:

  1. 构造器注入
  2. 二传手注射
  3. 资产注入

如果您将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM