java-Mockito验证方法未检测到方法调用

我正在尝试验证在我嘲笑的对象上调用了一个方法:

public class MyClass{
    public String someMethod(int arg){
        otherMethod();
        return "";
    }

    public void otherMethod(){ }
}    

public void testSomething(){
    MyClass myClass = Mockito.mock(MyClass.class);

    Mockito.when(myClass.someMethod(0)).thenReturn("test");

    assertEquals("test", myClass.someMethod(0));

    Mockito.verify(myClass).otherMethod(); // This would fail
}

这不是我的确切代码,但它模拟了我想做的事情.当尝试验证是否调用了otherMethod()时,代码将失败.这个对吗?我对verify方法的理解是,它应该检测存根方法(someMethod)中调用的任何方法

我希望我的问题和代码清楚

解决方法:

不,一个Mockito模拟将在所有调用中都返回null,除非您用eg覆盖. thenReturn()等

您正在寻找的是@Spy,例如:

MyClass mc = new MyClass();
MyClass mySpy = Mockito.spy( mc );
...
mySpy.someMethod( 0 );
Mockito.verify( mySpy ).otherMethod();   // This should work, unless you .thenReturn() someMethod!

如果您的问题是someMethod()包含您不想执行但希望被模拟的代码,则注入模拟而不是模拟方法调用本身,例如:

OtherClass otherClass; // whose methods all throw exceptions in test environment.

public String someMethod(int arg){
    otherClass.methodWeWantMocked();
    otherMethod();
    return "";
}

从而

MyClass mc = new MyClass();
OtherClass oc = Mockito.mock( OtherClass.class );
mc.setOtherClass( oc );
Mockito.when( oc.methodWeWantMocked() ).thenReturn( "dummy" );

我希望这是有道理的,对您有所帮助.

干杯,

上一篇:java-Mockito匹配器以匹配具有泛型和供应商的方法


下一篇:java-我该如何模拟void方法,并使用Mockito使其保持不变?