Les classes abstractes es coneixen com la classe declarada amb la paraula clau abstracta que pot incloure o no els mètodes abstractes. A Java, les classes abstractes no es poden instanciar, però es poden subclassificar. També pot tenir camps estàtics i mètodes estàtics.
En aquesta secció, parlarem de la burla o l'espionatge de classes abstractes. Analitzarem diversos casos de prova de classes abstractes amb mètodes no abstractes.
Per espiar o burlar-se de les classes abstractes, hem d'afegir les següents dependències de Maven:
- JUnit
- Mockito
- PowerMock
Totes les dependències necessàries del projecte es detallen a continuació:
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
Les dependències de PowerMock només són necessàries per a la prova en què fem ús de PowerMock.
Exemples de classe abstracta burla
1. Espionatge de classes abstractes utilitzant Mockito.spy()
En aquest exemple, espiarem les classes abstractes utilitzant el mètode Mockito.spy(). El mètode Mockito.spy() s'utilitza per crear una instància espia de la classe abstracta.
Pas 1: Creeu una classe abstracta anomenada Abstract1_class que contingui mètodes abstractes i no abstractes.
supw
Abstract1_class.java
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
Pas 2: Creeu un cas de prova JUnit anomenat Resum 1 Prova . Conté una instància espia de la classe abstracta.
Abstract1Test.java
Formateador de dates senzill 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); } }
Sortida
La sortida següent mostra que la prova s'està executant correctament.
L'inconvenient d'utilitzar el mètode Mockito.spy() és que invocarà el constructor de classes abstractes durant la creació de la instància espia. En la majoria dels casos, el constructor utilitza dependències externes que poden ser un obstacle per a les nostres execucions de proves unitàries. Aquestes dependències externes solen ser conegudes com a impediments de prova . És la raó per utilitzar el mètode Mockito.mock() per burlar-se de classes abstractes.
2. Burla de classe abstracta utilitzant Mockito.mock()
En aquest exemple, ens burlarem de les classes abstractes utilitzant el mètode Mockito.mock().
Normalment, la burla s'utilitza per crear un objecte clon o fictici de la classe. En altres paraules, deixa una classe vacant de la seva lògica o algorismes. La instància simulada creada no conté codi (lògica) dins dels mètodes.
Pas 1: Creeu una classe abstracta anomenada Abstract_Class que contingui mètodes abstractes i no abstractes.
Abstract_Class.java
public abstract class Abstract_Class { public String sayMock() { return 'Hii.. ' + getName() + symbol() ; } private String symbol() { return '!!'; } protected abstract String getName(); }
Pas 2: Creeu un cas de prova JUnit anomenat AbstractTestClass per burlar-se de la classe 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 codi anterior, i és una instància burlada creada amb el mètode Mockito.mock().
Sortida
scanner.next java
La sortida següent mostra que la prova s'està executant correctament amb Mockito.
L'enfocament anterior no és el millor, però es pot utilitzar. El següent enfocament es recomana perquè utilitza PowerMock i pot tenir control sobre els mètodes privats definits a les classes abstractes.
com es va inventar l'escola
3. Burla de classe abstracta utilitzant PowerMock
En l'exemple següent, utilitzarem el mètode PowerMockito.mock() per burlar-nos de les classes abstractes. L'ús de PowerMock en lloc de Mockito.mock() és un millor enfocament, ja que pot tenir control sobre els mètodes privats i estàtics.
Pas 1: Creeu una classe abstracta anomenada Classe_abstracte que conté mètodes abstractes i no abstractes.
Abstract_class.java
public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } }
Pas 2: Creeu un cas de prova JUnit anomenat AbstractTestClass amb finalitats de prova.
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); } }
Sortida
La sortida següent mostra que la prova s'està executant correctament amb PowerMock amb Mockito.