logo

Špijuniranje ili ismijavanje apstraktnih klasa

Apstraktne klase nazivaju se klasama deklariranim apstraktnom ključnom riječi koja može ali ne mora uključivati ​​apstraktne metode. U Javi se apstraktne klase ne mogu instancirati, ali mogu biti potklase. Također može imati statička polja i statičke metode.

U ovom odjeljku raspravljat ćemo o ismijavanju ili špijuniranju apstraktnih klasa. Analizirat ćemo nekoliko slučajeva testiranja apstraktnih klasa korištenjem neapstraktnih metoda.

Za špijuniranje ili ismijavanje apstraktnih klasa, moramo dodati sljedeće Maven ovisnosti:

  • JUnit
  • Mockito
  • PowerMock

Sve potrebne ovisnosti projekta navedene su u nastavku:

 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 

PowerMock ovisnosti potrebne su samo za test u kojem koristimo PowerMock.

Primjeri ismijavanja apstraktne klase

1. Špijuniranje apstraktne klase pomoću Mockito.spy()

U ovom primjeru ćemo špijunirati apstraktne klase pomoću metode Mockito.spy(). Metoda Mockito.spy() koristi se za stvaranje špijunske instance apstraktne klase.

Korak 1: Napravite apstraktnu klasu pod nazivom Abstract1_class koja sadrži i apstraktne i neapstraktne metode.

što je uri

Sažetak1_klasa.java

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

Korak 2: Stvorite JUnit test slučaj pod nazivom Sažetak1Test . Sadrži špijunsku instancu apstraktne klase.

Sažetak1Test.java

mb do gb
 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); } } 

Izlaz

Sljedeći izlaz pokazuje da se test uspješno izvodi.

Špijuniranje ili ismijavanje apstraktnih klasa

Nedostatak korištenja metode Mockito.spy() je taj što će pozvati konstruktor apstraktne klase tijekom stvaranja špijunske instance. U većini slučajeva, konstruktor koristi vanjske ovisnosti koje mogu predstavljati prepreku našim izvršavanjima jediničnih testova. Ove vanjske ovisnosti obično su poznate kao ispitne zapreke . To je razlog za korištenje metode Mockito.mock() za ismijavanje apstraktnih klasa.

2. Ismijavanje apstraktne klase pomoću Mockito.mock()

U ovom primjeru ismijat ćemo apstraktne klase pomoću metode Mockito.mock().

Obično se ismijavanje koristi za stvaranje klona ili lažnog objekta klase. Drugim riječima, oslobađa klasu od svoje logike ili algoritama. Stvorena lažna instanca ne sadrži kod (logiku) unutar metoda.

Korak 1: Napravite apstraktnu klasu pod nazivom Abstract_Class koja sadrži i apstraktne i neapstraktne metode.

Apstraktna_klasa.java

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

Korak 2: Stvorite JUnit test slučaj pod nazivom AbstractTestClass za ismijavanje apstraktne klase.

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()); } } 

U gornjem kodu, i je ismijana instanca stvorena pomoću metode Mockito.mock().

Izlaz

java dužina niza

Sljedeći rezultat pokazuje da se test uspješno izvodi pomoću Mockita.

Špijuniranje ili ismijavanje apstraktnih klasa

Gornji pristup nije najbolji, ali se može koristiti. Preporuča se sljedeći pristup jer koristi PowerMock i može imati kontrolu nad privatnim metodama definiranim u apstraktnim klasama.

leksikografski poredak

3. Ismijavanje apstraktne klase pomoću PowerMocka

U sljedećem primjeru koristit ćemo metodu PowerMockito.mock() za ismijavanje apstraktnih klasa. Korištenje PowerMocka umjesto Mockito.mock() je bolji pristup jer može imati kontrolu nad privatnim kao i statičkim metodama.

Korak 1: Napravite apstraktnu klasu pod nazivom Apstraktna_klasa koji sadrži i apstraktne i neapstraktne metode.

Sažetak_klase.java

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

Korak 2: Stvorite JUnit test slučaj pod nazivom AbstractTestClass za potrebe testiranja.

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); } } 
Ovdje smo zamolili PowerMock da prekine povratne vrijednosti privatne metode kako bismo mogli testirati metodu sayMock() bez ikakvih prepreka testiranju. Sam Mockito ne može uništiti ovu metodu, zato smo koristili PowerMock zajedno s Mockitom.

Izlaz

Sljedeći izlaz pokazuje da se test uspješno izvodi pomoću PowerMocka s Mockitom.

Špijuniranje ili ismijavanje apstraktnih klasa