logo

Spionere eller hånende abstrakte klasser

Abstrakte klasser blir referert til som klassen som er erklært med det abstrakte nøkkelordet som kanskje inkluderer de abstrakte metodene. I Java kan ikke abstrakte klasser instansieres, men de kan underklasses. Den kan også ha statiske felt og statiske metoder.

I denne delen vil vi diskutere hån eller spionering av abstrakte klasser. Vi vil analysere flere tilfeller av testing av de abstrakte klassene ved bruk av ikke-abstrakte metoder.

For å spionere eller håne de abstrakte klassene, må vi legge til følgende Maven-avhengigheter:

  • JUnit
  • Mockito
  • PowerMock

Alle nødvendige avhengigheter til prosjektet er gitt nedenfor:

 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-avhengighetene kreves kun for testen der vi bruker PowerMock.

Eksempler på Mocking Abstract Class

1. Spionere abstrakt klasse ved å bruke Mockito.spy()

I dette eksemplet skal vi spionere de abstrakte klassene ved å bruke Mockito.spy()-metoden. Metoden Mockito.spy() brukes til å lage en spionforekomst av den abstrakte klassen.

Trinn 1: Lag en abstrakt klasse kalt Abstract1_class som inneholder både abstrakte og ikke-abstrakte metoder.

Abstract1_class.java

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

Steg 2: Opprett en JUnit-testsak kalt Abstrakt 1Test . Den inneholder en spionforekomst av den abstrakte klassen.

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

Produksjon

Følgende utdata viser at testen er vellykket.

Spionere eller hånende abstrakte klasser

Ulempen med å bruke Mockito.spy()-metoden er at den vil påkalle den abstrakte klassekonstruktøren under opprettelsen av spionforekomsten. I de fleste tilfellene bruker konstruktøren eksterne avhengigheter som kan være en hindring for våre enhetstester. Disse eksterne avhengighetene er vanligvis kjent som testhindringer . Det er grunnen til å bruke Mockito.mock()-metoden for å håne abstrakte klasser.

2. Hånlig abstrakt klasse ved å bruke Mockito.mock()

I dette eksemplet skal vi håne de abstrakte klassene ved å bruke Mockito.mock()-metoden.

Vanligvis brukes mocking for å lage en klone eller dummy-objekt av klassen. Med andre ord, det gjør en klasse ledig fra dens logikk eller algoritmer. Den opprettede mock-forekomsten inneholder ikke kode (logikk) inne i metodene.

Trinn 1: Lag en abstrakt klasse kalt Abstract_Class som inneholder både abstrakte og ikke-abstrakte metoder.

Abstract_Class.java

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

Steg 2: Opprett en JUnit-testsak kalt Abstrakt testklasse for å håne den abstrakte klassen.

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

I koden ovenfor, og er en hånet forekomst opprettet ved hjelp av Mockito.mock()-metoden.

Produksjon

Følgende utdata viser at testen kjører vellykket med Mockito.

Spionere eller hånende abstrakte klasser

Tilnærmingen ovenfor er ikke den beste, men den kan brukes. Den neste tilnærmingen anbefales fordi den bruker PowerMock, og kan ha kontroll over de private metodene som er definert i abstraktklassene.

3. Hånlig abstrakt klasse ved hjelp av PowerMock

I følgende eksempel vil vi bruke PowerMockito.mock()-metoden for å håne de abstrakte klassene. Å bruke PowerMock i stedet for Mockito.mock() er en bedre tilnærming da den kan ha kontroll over både private og statiske metoder.

Trinn 1: Lag en abstrakt klasse kalt Abstrakt_klasse som inneholder både abstrakte og ikke-abstrakte metoder.

Abstract_class.java

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

Steg 2: Opprett en JUnit-testsak kalt Abstrakt testklasse for testformål.

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); } } 
Her har vi bedt PowerMock om å stoppe den private metodens returverdier slik at vi kan teste sayMock()-metoden uten testhindringer. Mockito alene kan ikke stoppe denne metoden, det er derfor vi har brukt PowerMock sammen med Mockito.

Produksjon

Følgende utgang viser at testen kjører vellykket med PowerMock med Mockito.

Spionere eller hånende abstrakte klasser