Naar abstracte klassen wordt verwezen als de klasse die wordt gedeclareerd met het abstracte sleutelwoord en die al dan niet de abstracte methoden kan bevatten. In Java kunnen abstracte klassen niet worden geïnstantieerd, maar ze kunnen wel worden onderverdeeld in subklassen. Het kan ook statische velden en statische methoden hebben.
In deze sectie bespreken we het bespotten of bespioneren van abstracte klassen. We zullen verschillende gevallen analyseren waarin de abstracte klassen worden getest met behulp van niet-abstracte methoden.
Om de abstracte klassen te bespioneren of te bespotten, moeten we de volgende Maven-afhankelijkheden toevoegen:
jakhals versus wolf
- JUnit
- Mockito
- PowerMock
Hieronder vindt u alle vereiste afhankelijkheden van het project:
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
De PowerMock-afhankelijkheden zijn alleen nodig voor de test waarin we gebruik maken van PowerMock.
Voorbeelden van spottende abstracte klasse
1. Abstracte klasse bespioneren met Mockito.spy()
In dit voorbeeld gaan we de abstracte klassen bespioneren met behulp van de Mockito.spy() methode. De methode Mockito.spy() wordt gebruikt om een spionage-instantie van de abstracte klasse te maken.
Stap 1: Maak een abstracte klasse met de naam Abstract1_class die zowel abstracte als niet-abstracte methoden bevat.
Abstract1_class.java
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
Stap 2: Maak een JUnit-testcase met de naam Samenvatting1Test . Het bevat een spionage-instantie van de abstracte 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); } }
Uitvoer
de meest mooie glimlach
Uit de volgende uitvoer blijkt dat de test met succes is uitgevoerd.
Het nadeel van het gebruik van de Mockito.spy()-methode is dat deze de abstracte klasseconstructor zal aanroepen tijdens het maken van een spionage-instantie. In de meeste gevallen maakt de constructor gebruik van externe afhankelijkheden die een obstakel kunnen vormen voor onze unit-testuitvoeringen. Deze externe afhankelijkheden staan meestal bekend als de belemmeringen testen . Dit is de reden om de Mockito.mock()-methode te gebruiken voor het bespotten van abstracte klassen.
2. Een abstracte klasse bespotten met Mockito.mock()
In dit voorbeeld gaan we de abstracte klassen bespotten met behulp van de Mockito.mock() -methode.
Meestal wordt spotten gebruikt om een kloon- of dummy-object van de klasse te maken. Met andere woorden, het maakt een klasse vrij van zijn logica of algoritmen. De gemaakte nepinstantie bevat geen code (logica) in de methoden.
Stap 1: Maak een abstracte klasse met de naam Abstract_Class die zowel abstracte als niet-abstracte methoden bevat.
Abstract_Class.java
public abstract class Abstract_Class { public String sayMock() { return 'Hii.. ' + getName() + symbol() ; } private String symbol() { return '!!'; } protected abstract String getName(); }
Stap 2: Maak een JUnit-testcase met de naam SamenvattingTestKlasse voor het bespotten van de abstracte klasse.
SamenvattingTestClass.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()); } }
In de bovenstaande code, En is een nagebootste instantie gemaakt met behulp van de Mockito.mock() -methode.
Uitvoer
Uit de volgende uitvoer blijkt dat de test met succes wordt uitgevoerd met Mockito.
De bovenstaande aanpak is niet de beste, maar kan wel worden gebruikt. De volgende aanpak wordt aanbevolen omdat deze PowerMock gebruikt en controle kan hebben over de privémethoden die in de abstracte klassen zijn gedefinieerd.
3. Een abstracte klasse bespotten met PowerMock
In het volgende voorbeeld gebruiken we de PowerMockito.mock()-methode om de abstracte klassen te bespotten. Het gebruik van PowerMock in plaats van Mockito.mock() is een betere aanpak, omdat het controle kan hebben over zowel de privé- als de statische methoden.
Stap 1: Maak een abstracte klasse met de naam Samenvatting_klasse die zowel abstracte als niet-abstracte methoden bevat.
Abstract_class.java
public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } }
Stap 2: Maak een JUnit-testcase met de naam SamenvattingTestKlasse voor testdoeleinden.
SamenvattingTestClass.java
booleaans in c
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); } }
Uitvoer
De volgende uitvoer laat zien dat de test met succes wordt uitgevoerd met PowerMock met Mockito.