logo

Classes abstractes d'espionatge o burla

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.

Classes abstractes d'espionatge o burla

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.

Classes abstractes d'espionatge o burla

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); } } 
Aquí, hem demanat al PowerMock que esborri els valors de retorn del mètode privat perquè puguem provar el mètode sayMock() sense cap impediment de prova. Mockito per si sol no pot evitar aquest mètode, per això hem utilitzat PowerMock juntament amb Mockito.

Sortida

La sortida següent mostra que la prova s'està executant correctament amb PowerMock amb Mockito.

Classes abstractes d'espionatge o burla