未调用模拟方法-java
我是新来Mockito的,请帮助我理解基本知识 根据我的说法,当调用未调用模拟方法-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
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为什么要应用该规则?