interfaces - interfaz grafica en java netbeans ejemplos pdf
¿Se puede hacer que mockito(1.10.17) funcione con métodos predeterminados en las interfaces? (4)
Acabo de probar Mockito 2.0.38-beta, y ya funciona en esa versión. Pero a Mockito se le debe decir explícitamente que llame a la implementación predeterminada.
Foo foo = mock(Foo.class);
assertThat(foo.bar()).isEqualTo(0);
when(foo.bar()).thenCallRealMethod();
assertThat(foo.bar()).isEqualTo(42);
Soy un gran fanático de Mockito, desafortunadamente para uno de mis proyectos que usa Java 8, me falla ...
Guión:
public final class MockTest
{
@Test
public void testDefaultMethodsWithMocks()
{
final Foo foo = mock(Foo.class);
//when(foo.bar()).thenCallRealMethod();
assertThat(foo.bar()).isEqualTo(42);
}
@FunctionalInterface
private interface Foo
{
int foo();
default int bar()
{
return 42;
}
}
}
Desafortunadamente, la prueba falla y foo.bar()
devuelve 0.
Cuando elimino el comentario de la línea when()
, obtengo un seguimiento de la pila ...
java.lang.NoSuchMethodError: java.lang.Object.bar()I
at com.github.fge.lambdas.MockTest.testDefaultMethodsWithMocks(MockTest.java:18)
Esta es la última versión estable disponible en maven; googlear no me dice mucho sobre el estado de mockito con respecto a esta nueva funcionalidad en Java 8 ...
¿Puedes hacer que funcione de alguna otra manera que implementar interfaces y spy()
en ellos (esto funciona)?
Lamentablemente todavía no es posible (mockito 1.10.19), de README.md
en github''page
Estado JDK8
Mockito debería funcionar bien con JDK8 si te mantienes alejado de los métodos predeterminados (también conocidos como métodos de defensa) . El uso de Lambda puede funcionar igual de bien para las respuestas. No estamos seguros de todas las funciones de JDK8 en este momento, como serializar un simulacro que utiliza una lambda. El informe de error y la solicitud de extracción son bienvenidos (guía contribuyente).
EDIT 1 : los métodos de defensa y los métodos predeterminados son nombres diferentes para la misma cosa.
Espero un reemplazo de generador que maneje correctamente los códigos de Java 8 para estos casos, ya que algunos códigos de operación tienen una semántica diferente en Java 8.
EDIT 2 : Actualicé el archivo de prueba de Mockito, y esta cita en consecuencia
Me encontré con el mismo problema con Mockito (org.mockito: mockito-core: 1.10.19). El problema es: no puedo cambiar la versión de Mockito (2.7.22 funcionaría) debido a las dependencias de org.springframework.boot: spring-boot-starter-test: 1.4.3.RELEASE que estamos usando ( Spring, Problema de Mockito ).
La solución más fácil que encontré es implementar la interfaz con una clase abstracta privada dentro de mi clase de prueba y burlar esa (también se compara con la solución de @Mihai Bojin). Hacerlo así lo mantiene alejado de la molestia de "implementar" todos los métodos requeridos por la (s) interfaz (es).
MWE:
public interface InterfaceWithDefaults implements SomeOtherInterface {
default int someConstantWithoutSense() {
return 11;
}
}
public class SomeTest {
private abstract class Dummy implements InterfaceWithDefaults {}
@Test
public void testConstant() {
InterfaceWithDefaults iwd = Mockito.mock(Dummy.class);
Assert.assertEquals(11, iwd.someConstantWithoutSense());
}
}
Puede evitar esta limitación implementando la interfaz (probada en Mockito 1.10.19):
public class TestClass {
@Mock ImplementsIntWithDefaultMethods someObject;
@Test public void test() throws Exception {
// calling default method on mocked subtype works
someObject.callDefaultMethod();
}
/* Type that implements the interface */
static class ImplementsIntWithDefaultMethods implements IntWithDefaultMethod { }
/* Interface you need mocked */
interface IntWithDefaultMethod {
default void callDefaultMethod { }
}
}