Abstrakta klasser hänvisas till som den klass som deklareras med det abstrakta nyckelordet som kan eller kanske inte inkluderar de abstrakta metoderna. I Java kan abstrakta klasser inte instansieras, men de kan underklassas. Den kan också ha statiska fält och statiska metoder.
I det här avsnittet kommer vi att diskutera hån eller spioneri av abstrakta klasser. Vi kommer att analysera flera fall av att testa de abstrakta klasserna med hjälp av icke-abstrakta metoder.
För att spionera eller håna de abstrakta klasserna måste vi lägga till följande Maven-beroenden:
sql ddl-kommandon
- JUnit
- Mockito
- PowerMock
Alla nödvändiga beroenden för projektet ges nedan:
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-beroendena krävs endast för testet där vi använder PowerMock.
Exempel på Mocking Abstract Class
1. Spionera abstrakt klass med Mockito.spy()
I det här exemplet kommer vi att spionera de abstrakta klasserna med metoden Mockito.spy(). Metoden Mockito.spy() används för att skapa en spioninstans av den abstrakta klassen.
Steg 1: Skapa en abstrakt klass med namnet Abstract1_class som innehåller både abstrakta och icke-abstrakta metoder.
Abstract1_class.java
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
Steg 2: Skapa ett JUnit-testfall med namnet Abstrakt 1Test . Den innehåller en spioninstans av den abstrakta 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); } }
Produktion
är lika med metod i java
Följande utdata visar att testet körs framgångsrikt.
Nackdelen med att använda metoden Mockito.spy() är att den kommer att anropa den abstrakta klasskonstruktorn under skapandet av spioninstansen. I de flesta fall använder konstruktören externa beroenden som kan vara ett hinder för våra enhetstestkörningar. Dessa externa beroenden är vanligtvis kända som testhinder . Det är anledningen till att använda metoden Mockito.mock() för att håna abstrakta klasser.
2. Håna abstrakt klass med Mockito.mock()
I det här exemplet kommer vi att håna de abstrakta klasserna med metoden Mockito.mock().
Vanligtvis används mocking för att skapa en klon eller ett dummyobjekt av klassen. Med andra ord gör den en klass tom från dess logik eller algoritmer. Den skapade mock-instansen innehåller inte kod (logik) i metoderna.
Steg 1: Skapa en abstrakt klass med namnet Abstract_Class som innehåller både abstrakta och icke-abstrakta 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: Skapa ett JUnit-testfall med namnet AbstractTestClass för att håna den abstrakta 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 ovanstående kod, och är en hånad instans skapad med metoden Mockito.mock().
Produktion
Följande utdata visar att testet körs framgångsrikt med Mockito.
Ovanstående tillvägagångssätt är inte det bästa, men det kan användas. Nästa tillvägagångssätt rekommenderas eftersom det använder PowerMock och kan ha kontroll över de privata metoder som definieras i de abstrakta klasserna.
3. Håna abstrakt klass med PowerMock
I följande exempel kommer vi att använda metoden PowerMockito.mock() för att håna de abstrakta klasserna. Att använda PowerMock istället för Mockito.mock() är ett bättre tillvägagångssätt eftersom det kan ha kontroll över såväl privata som statiska metoder.
Steg 1: Skapa en abstrakt klass med namnet Abstrakt_klass som innehåller både abstrakta och icke-abstrakta metoder.
Abstract_class.java
public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } }
Steg 2: Skapa ett JUnit-testfall med namnet AbstractTestClass för teständamål.
AbstractTestClass.java
jvm i 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öljande utdata visar att testet körs framgångsrikt med PowerMock med Mockito.