未调用模拟方法-java

未调用模拟方法-java,java,unit-testing,mockito,Java,Unit Testing,Mockito,我是新来Mockito的,请帮助我理解基本知识 根据我的说法,当调用mock.add(6,7)时,上面的代码应该打印5,但是没有调用add()方法,代码打印0。。为什么?这个代码有什么解决方案吗 import org.mockito.Mockito; import static org.mockito.Mockito.*; class Calc{ int add(int a,int b){ System.out.println("a

我是新来Mockito的,请帮助我理解基本知识

根据我的说法,当调用
mock.add(6,7)
时,上面的代码应该打印5,但是没有调用
add()
方法,代码打印0。。为什么?这个代码有什么解决方案吗

    import org.mockito.Mockito;

    import static org.mockito.Mockito.*;


    class Calc{

        int add(int a,int b){
        System.out.println("add method called");
        return a+b;
    }
}


为了得到5的结果,必须在设置when..then时传递准确的参数as。否则,mockito将返回一个“默认”值(整数为0:

默认情况下模拟返回什么值

为了透明和不引人注目,所有Mockito mocks由 默认返回“nice”值。例如:零、假、空 集合或空值。请参阅javadocs中有关存根的内容,以准确查看 默认情况下返回哪些值

如果要为任何整数返回5,请使用:

when(mocked.add(Mockito.any(Integer.class),Mockito.any(Integer.class))).thenReturn(5);
“mock”只是一个空的虚拟对象,它模拟“真实”对象的行为。如果您在(mock.add(2,3)).thenReturn(5);接收到这些精确值时定义了一种行为,例如

mocked.add(6,7)
此时将返回
0
,因为您尚未为这些值定义其行为,因此使用默认值。因此,如果您想覆盖所有可能的输入,可以使用@MaciejKowalski post解决方案,并使用
Mockito.any(Integer.class)等通用匹配器

我仍然认为,如何正确处理mock还不清楚。mock是一种向被测系统提供外部依赖性的方法,无需设置整个依赖关系树。该类中的实际方法通常不会被调用。这类似于
when(mocked.add(2,3))。然后返回(5);
的意思是,它告诉模拟对象要像真实的依赖项那样行事,而实际上不需要它

一个例子如下所示:

public class TestClass {
    private ExternalDependency dep;
    public void setDep(ExternalDependency dep) {
        this.dep = dep;
    }
    public int calculate() {
        return 5 + dep.doStuff();
    }
}

public class ExternalDependency {
    public int doStuff() {
        return 3;
    }
}
@Test
public void should_use_external_dependency() {
    // Aquire a mocked object of the class
    ExternalDependency mockedDep = Mockito.mock(ExternalDependency.class);
    // Define its behaviour
    Mockito.when(mockedDep.doStuff()).thenReturn(20);

    TestClass sut = new TestClass();
    sut.setDep(mockedDep);

    // should return 25, since we've defined the mocks behaviour to return 20
    Assert.assertEquals(25, sut.calculate());
}
现在,您可以在测试代码中使用如下模拟:

public class TestClass {
    private ExternalDependency dep;
    public void setDep(ExternalDependency dep) {
        this.dep = dep;
    }
    public int calculate() {
        return 5 + dep.doStuff();
    }
}

public class ExternalDependency {
    public int doStuff() {
        return 3;
    }
}
@Test
public void should_use_external_dependency() {
    // Aquire a mocked object of the class
    ExternalDependency mockedDep = Mockito.mock(ExternalDependency.class);
    // Define its behaviour
    Mockito.when(mockedDep.doStuff()).thenReturn(20);

    TestClass sut = new TestClass();
    sut.setDep(mockedDep);

    // should return 25, since we've defined the mocks behaviour to return 20
    Assert.assertEquals(25, sut.calculate());
}

如果调用了
sut.calculate()
,则不应真正调用
ExternalDependency
中的方法,而是将其委托给模拟存根对象。但是,如果要调用实类的实方法,可以使用Spy代替
Mockito.Spy(ExternalDependency.class)
或者你可以用
when(mockedDep.doStuff())。然后调用realmethod();

你的问题对我来说毫无意义。你明确地对mockito说“当参数为2和3时,返回5”,然后通过6和7…如果前提条件不满足,mockito为什么要应用该规则?