Abstrakteja luokkia kutsutaan luokiksi, jotka on ilmoitettu abstraktilla avainsanalla, joka voi sisältää tai ei välttämättä sisältää abstrakteja menetelmiä. Javassa abstrakteja luokkia ei voi ilmentää, mutta ne voidaan jakaa alaluokkiin. Siinä voi olla myös staattisia kenttiä ja staattisia menetelmiä.
Tässä osiossa käsittelemme abstraktien luokkien pilkkaamista tai vakoilua. Analysoimme useita tapauksia, joissa abstrakteja luokkia testataan ei-abstrakteilla menetelmillä.
c++ setti
Abstraktien luokkien vakoilua tai pilkkaamista varten meidän on lisättävä seuraavat Maven-riippuvuudet:
- JUnit
- Mockito
- PowerMock
Kaikki projektin vaadittavat riippuvuudet on annettu alla:
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-riippuvuudet vaaditaan vain siinä testissä, jossa käytämme PowerMockia.
Esimerkkejä pilkkaavasta abstraktista luokasta
1. Abstraktin luokan vakoilu käyttämällä Mockito.spy()
Tässä esimerkissä aiomme vakoilla abstrakteja luokkia Mockito.spy() -menetelmällä. Mockito.spy()-menetelmää käytetään abstraktin luokan vakoilu-ilmentymän luomiseen.
Vaihe 1: Luo abstrakti luokka nimeltä Abstract1_class, joka sisältää sekä abstrakteja että ei-abstrakteja menetelmiä.
Abstract1_class.java
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
Vaihe 2: Luo JUnit-testitapaus nimeltä Abstract 1 Test . Se sisältää abstraktin luokan vakoilu-esiintymän.
Abstract1Test.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); } }
Lähtö
Seuraava tulos osoittaa, että testi on onnistunut.
Yhdistä lajittelu
Mockito.spy()-menetelmän käytön haittana on, että se kutsuu abstraktin luokkakonstruktorin vakoilu-ilmentymän luomisen aikana. Useimmissa tapauksissa rakentaja käyttää ulkoisia riippuvuuksia, jotka voivat olla esteenä yksikkötestien suorittamiselle. Nämä ulkoiset riippuvuudet tunnetaan yleensä nimellä testaa esteitä . Se on syy käyttää Mockito.mock()-metodia abstraktien luokkien pilkkaamiseen.
2. Abstraktin luokan pilkkaaminen käyttämällä Mockito.mock()
Tässä esimerkissä aiomme pilkata abstrakteja luokkia käyttämällä Mockito.mock()-metodia.
Yleensä pilkkaamista käytetään luomaan luokan klooni tai valeobjekti. Toisin sanoen se tekee luokan tyhjäksi sen logiikasta tai algoritmeista. Luotu malliinstanssi ei sisällä koodia (logiikkaa) menetelmien sisällä.
Vaihe 1: Luo abstrakti luokka nimeltä Abstract_Class, joka sisältää sekä abstrakteja että ei-abstrakteja menetelmiä.
Abstract_Class.java
public abstract class Abstract_Class { public String sayMock() { return 'Hii.. ' + getName() + symbol() ; } private String symbol() { return '!!'; } protected abstract String getName(); }
Vaihe 2: Luo JUnit-testitapaus nimeltä AbstractTestClass abstraktin luokan pilkkaamisesta.
atoi c
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()); } }
Yllä olevassa koodissa ja on pilkattu ilmentymä, joka on luotu Mockito.mock()-menetelmällä.
Lähtö
Seuraava tulos osoittaa, että testi suoritetaan onnistuneesti Mockiton avulla.
Yllä oleva lähestymistapa ei ole paras, mutta sitä voidaan käyttää. Seuraavaa lähestymistapaa suositellaan, koska se käyttää PowerMockia ja voi hallita abstrakteissa luokissa määriteltyjä yksityisiä menetelmiä.
3. Abstraktin luokan pilkkaaminen PowerMockilla
Seuraavassa esimerkissä käytämme PowerMockito.mock()-metodia abstraktien luokkien pilkkaamiseen. PowerMockin käyttäminen Mockito.mock():n sijaan on parempi lähestymistapa, koska sillä voi hallita sekä yksityisiä että staattisia menetelmiä.
Vaihe 1: Luo abstrakti luokka nimeltä Abstract_class joka sisältää sekä abstrakteja että ei-abstrakteja menetelmiä.
binäärihakupuu]
Abstract_class.java
public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } }
Vaihe 2: Luo JUnit-testitapaus nimeltä AbstractTestClass testaustarkoituksiin.
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); } }
Lähtö
Seuraava tulos osoittaa, että testi suoritetaan onnistuneesti käyttämällä PowerMockia Mockiton kanssa.