Я не могу смоделировать метод, определенный как интерфейс по умолчанию.Может кто-нибудь помочь мне здесь?
В интерфейсе есть метод по умолчанию, обеспечивающий регистратор.
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());
}
}
, как вы можете видеть, я пытался смоделировать метод по умолчанию двумя способами:
when(loggableMock.logger()).thenReturn(loggerMock);
when(appSpy.logger()).thenReturn(loggerMock);
, но он не работает,Результат:
Требуется, но не вызывается: logger.debug ();-> at so.AppShowOffTest.doMagic (AppShowOffTest.java:29) На самом деле с этим макетом не было никаких взаимодействий.