logo

Espiar o burlarse de clases abstractas

Las clases abstractas se denominan clases declaradas con la palabra clave abstracta que puede incluir o no los métodos abstractos. En Java, no se pueden crear instancias de clases abstractas, pero se pueden subclasificar. También puede tener campos estáticos y métodos estáticos.

En esta sección, discutiremos la burla o el espionaje de clases abstractas. Analizaremos varios casos de prueba de clases abstractas utilizando métodos no abstractos.

Para espiar o burlarse de las clases abstractas, necesitamos agregar las siguientes dependencias de Maven:

  • unidad conjunta
  • Mockito
  • PowerMock

Todas las dependencias requeridas del proyecto se detallan a continuación:

 junit junit 4.12 test org.mockito mockito-all 1.10.19 test org.powermock powermock-module-junit4 1.7.4 test org.powermock powermock-api-mockito 1.7.0 test 

Las dependencias de PowerMock solo son necesarias para la prueba en la que utilizamos PowerMock.

Ejemplos de clase abstracta burlona

1. Espiar clases abstractas usando Mockito.spy()

En este ejemplo, vamos a espiar las clases abstractas usando el método Mockito.spy(). El método Mockito.spy() se utiliza para crear una instancia espía de la clase abstracta.

Paso 1: Cree una clase abstracta llamada Abstract1_class que contenga métodos abstractos y no abstractos.

sobrecarga de métodos

Abstract1_class.java

 public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } } 

Paso 2: Cree un caso de prueba JUnit llamado Resumen1Prueba . Contiene una instancia espía de la clase abstracta.

Abstract1Test.java

cadena separada en java
 import static org.junit.Assert.*; import org.junit.Test; import org.mockito.Mockito; import junit.framework.Assert; public class Abstract1Test { @Test public void testing_usingSpy() { Abstract1_class abstclas = Mockito.spy(Abstract1_class.class); String res = abstclas.methodUnderTest(); Assert.assertEquals('one', res); } } 

Producción

El siguiente resultado muestra que la prueba se está ejecutando correctamente.

Espiar o burlarse de clases abstractas

El inconveniente de utilizar el método Mockito.spy() es que invocará el constructor de clase abstracta durante la creación de la instancia espía. En la mayoría de los casos, el constructor utiliza dependencias externas que pueden ser un obstáculo para la ejecución de nuestras pruebas unitarias. Estas dependencias externas generalmente se conocen como impedimentos de prueba . Es la razón para utilizar el método Mockito.mock() para burlarse de clases abstractas.

2. Burlarse de una clase abstracta usando Mockito.mock()

En este ejemplo, vamos a simular las clases abstractas usando el método Mockito.mock().

Por lo general, la burla se utiliza para crear un clon o un objeto ficticio de la clase. En otras palabras, deja vacante una clase de su lógica o algoritmos. La instancia simulada creada no contiene código (lógica) dentro de los métodos.

Paso 1: Cree una clase abstracta llamada Abstract_Class que contenga métodos abstractos y no abstractos.

Abstract_Class.java

 public abstract class Abstract_Class { public String sayMock() { return 'Hii.. ' + getName() + symbol() ; } private String symbol() { return '!!'; } protected abstract String getName(); } 

Paso 2: Cree un caso de prueba JUnit llamado Clase de prueba abstracta por burlarse de la clase abstracta.

AbstractTestClass.java

 import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Test; public class AbstractTestClass { @Test public void test_AbstractClasses() { Abstract_Class ac = mock(Abstract_Class.class); when(ac.sayMock()).thenCallRealMethod(); when(ac.getName()).thenReturn('Jyotika'); assertEquals('Hii.. Jyotika!!', ac.sayMock()); } } 

En el código anterior, y es una instancia simulada creada usando el método Mockito.mock().

Producción

administrador de powershell

El siguiente resultado muestra que la prueba se está ejecutando correctamente con Mockito.

Espiar o burlarse de clases abstractas

El enfoque anterior no es el mejor, pero se puede utilizar. Se recomienda el siguiente enfoque porque utiliza PowerMock y puede tener control sobre los métodos privados definidos en las clases abstractas.

cadena de análisis de Java a int

3. Burlarse de una clase abstracta usando PowerMock

En el siguiente ejemplo, usaremos el método PowerMockito.mock() para burlarnos de las clases abstractas. Usar PowerMock en lugar de Mockito.mock() es un mejor enfoque ya que puede tener control sobre los métodos privados y estáticos.

Paso 1: Crea una clase abstracta llamada Clase abstracta que contiene métodos tanto abstractos como no abstractos.

Abstract_class.java

 public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } } 

Paso 2: Cree un caso de prueba JUnit llamado Clase de prueba abstracta con fines de prueba.

AbstractTestClass.java

 import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest( Abstract_Class.class) public class AbstractTestClass { @Test public void test_AbstractClassesusing_PowerMock() throws Exception { // given Abstract_Class ac = PowerMockito.mock(Abstract_Class.class); PowerMockito.doCallRealMethod().when(ac).sayMock(); PowerMockito.doReturn('Sharma').when(ac , 'getName'); //when String newstring = ac.sayMock(); //then assertEquals('Sharma13', newstring); System.out.println(newstring); } } 
Aquí, le hemos pedido a PowerMock que bloquee los valores de retorno del método privado para que podamos probar el método sayMock() sin ningún impedimento de prueba. Mockito por sí solo no puede eliminar este método, es por eso que hemos utilizado PowerMock junto con Mockito.

Producción

El siguiente resultado muestra que la prueba se ejecuta correctamente utilizando PowerMock con Mockito.

Espiar o burlarse de clases abstractas