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.
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.
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); } }
Izlaz
Sljedeći izlaz pokazuje da se test uspješno izvodi pomoću PowerMocka s Mockitom.