如何模拟接口默认方法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());