Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何模拟接口默认方法Java8/Mockito2_Java_Unit Testing_Mockito - Fatal编程技术网

如何模拟接口默认方法Java8/Mockito2

如何模拟接口默认方法Java8/Mockito2,java,unit-testing,mockito,Java,Unit Testing,Mockito,我不能在接口中模拟定义为默认值的方法。有人能帮我吗 该接口具有提供记录器的默认方法 import org.slf4j.Logger; import org.slf4j.LoggerFactory; public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } 它是这样使用的: public class AppShowOff

我不能在接口中模拟定义为默认值的方法。有人能帮我吗

该接口具有提供记录器的默认方法

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public interface Loggable {

  default Logger logger() {
    return LoggerFactory.getLogger(this.getClass());
  }
}
它是这样使用的:

public class AppShowOff implements Loggable{

  public void doMagic() {
    logger().debug("It works");
    System.out.println("Works");
  }
}
现在我想编写一个测试来证明调试方法已经被调用

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.junit.Test;
import org.mockito.Mockito;
import org.slf4j.Logger;

public class AppShowOffTest {

  @Test
  public void doMagic() {
    Logger loggerMock = mock(Logger.class);
    Loggable loggableMock = mock(Loggable.class); // <- not needed, but I also tried this way

    // mocks done

    AppShowOff app = new AppShowOff();
    AppShowOff appSpy = Mockito.spy(new AppShowOff());

    when(loggableMock.logger()).thenReturn(loggerMock);
    when(appSpy.logger()).thenReturn(loggerMock);

    app.doMagic();
    verify(loggerMock, times(1)).debug(any());
  }
}
但它不起作用。结果是:

需要但未调用:logger.debug(); ->实际上,在so.AppShowOffTest.doMagic(AppShowOffTest.java:29)上,没有与这个mock的交互

在这里:

第一个
应用程序
。。。除了调用测试中的方法
doMagic()
之外,从未使用过


简单的答案是:完全放下
app
,调用
appSpy.doMagic()

你在
appSpy
上模拟,但在
app
上调用
doMagic
。。。
when(loggableMock.logger()).thenReturn(loggerMock);
when(appSpy.logger()).thenReturn(loggerMock);
AppShowOff app = new AppShowOff();
AppShowOff appSpy = Mockito.spy(new AppShowOff());