Abstrakte klasser omtales som den klasse, der er erklæret med det abstrakte nøgleord, der muligvis inkluderer de abstrakte metoder. I Java kan abstrakte klasser ikke instansieres, men de kan underklassificeres. Det kan også have statiske felter og statiske metoder.
I dette afsnit vil vi diskutere hån eller spionage af abstrakte klasser. Vi vil analysere flere tilfælde af at teste de abstrakte klasser ved hjælp af ikke-abstrakte metoder.
For at spionere eller håne de abstrakte klasser skal vi tilføje følgende Maven-afhængigheder:
- JUnit
- Mockito
- PowerMock
Alle de nødvendige afhængigheder af projektet er angivet 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-afhængighederne er kun nødvendige for den test, hvor vi gør brug af PowerMock.
Eksempler på mocking abstrakt klasse
1. Spionering af abstrakt klasse ved hjælp af Mockito.spy()
I dette eksempel skal vi spionere de abstrakte klasser ved hjælp af Mockito.spy() metoden. Metoden Mockito.spy() bruges til at oprette en spioninstans af den abstrakte klasse.
Trin 1: Opret en abstrakt klasse ved navn Abstract1_class, der indeholder både abstrakte og ikke-abstrakte metoder.
Abstract1_class.java
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
Trin 2: Opret en JUnit-testcase med navnet Abstrakt 1Test . Den indeholder en spionforekomst af den abstrakte klasse.
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); } }
Produktion
Følgende output viser, at testen kører med succes.
Ulempen ved at bruge metoden Mockito.spy() er, at den vil påkalde den abstrakte klassekonstruktør under oprettelsen af spioninstansen. I de fleste tilfælde bruger konstruktøren eksterne afhængigheder, der kan være en hindring for vores enhedstestudførelser. Disse eksterne afhængigheder er normalt kendt som testhindringer . Det er grunden til at bruge Mockito.mock() metoden til at håne abstrakte klasser.
2. Hånende abstrakt klasse ved hjælp af Mockito.mock()
I dette eksempel skal vi håne de abstrakte klasser ved hjælp af metoden Mockito.mock().
Normalt bruges mocking til at skabe en klon eller dummy-objekt af klassen. Med andre ord gør den en klasse ledig fra dens logik eller algoritmer. Den oprettede mock-instans indeholder ikke kode (logik) inde i metoderne.
Trin 1: Opret en abstrakt klasse ved navn Abstract_Class, der indeholder 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(); }
Trin 2: Opret en JUnit-testcase med navnet Abstrakt testklasse for at håne den abstrakte klasse.
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 ovenstående kode, og er en hånet instans oprettet ved hjælp af Mockito.mock() metoden.
Produktion
Følgende output viser, at testen kører med succes med Mockito.
Ovenstående tilgang er ikke den bedste, men den kan bruges. Den næste tilgang anbefales, fordi den bruger PowerMock og kan have kontrol over de private metoder, der er defineret i de abstrakte klasser.
3. Hånende abstrakt klasse ved hjælp af PowerMock
I det følgende eksempel vil vi bruge PowerMockito.mock() metoden til at håne de abstrakte klasser. At bruge PowerMock i stedet for Mockito.mock() er en bedre tilgang, da det kan have kontrol over de private såvel som statiske metoder.
Trin 1: Opret en abstrakt klasse med navnet Abstrakt_klasse der indeholder både abstrakte og ikke-abstrakte metoder.
Abstrakt_klasse.java
streng erstatte al java
public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } }
Trin 2: Opret en JUnit-testcase med navnet Abstrakt testklasse til 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); } }
Produktion
Følgende output viser, at testen kører med succes med PowerMock med Mockito.