logo

Abstraktien vakoilu- tai pilkkaaminen

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
Abstraktien vakoilu- tai pilkkaaminen

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.

Abstraktien vakoilu- tai pilkkaaminen

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); } } 
Tässä olemme pyytäneet PowerMockia pitämään yksityisen menetelmän palautusarvot, jotta voimme testata sayMock()-menetelmää ilman testausesteitä. Mockito ei yksinään voi estää tätä menetelmää, siksi olemme käyttäneet PowerMockia yhdessä Mockiton kanssa.

Lähtö

Seuraava tulos osoittaa, että testi suoritetaan onnistuneesti käyttämällä PowerMockia Mockiton kanssa.

Abstraktien vakoilu- tai pilkkaaminen