Abstraktní třídy se označují jako třída deklarovaná klíčovým slovem abstract, které může nebo nemusí obsahovat abstraktní metody. V Javě nemohou být abstraktní třídy konkretizovány, ale mohou být podtříděny. Může mít také statická pole a statické metody.
V této části se budeme zabývat zesměšňováním nebo špehováním abstraktních tříd. Budeme analyzovat několik případů testování abstraktních tříd pomocí neabstraktních metod.
Pro špehování nebo zesměšňování abstraktních tříd musíme přidat následující závislosti Maven:
- JUnit
- Mockito
- PowerMock
Všechny požadované závislosti projektu jsou uvedeny níže:
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
Závislosti PowerMock jsou vyžadovány pouze pro test, ve kterém používáme PowerMock.
Příklady zesměšňující abstraktní třídy
1. Špehování abstraktní třídy pomocí Mockito.spy()
V tomto příkladu budeme špehovat abstraktní třídy pomocí metody Mockito.spy(). Metoda Mockito.spy() se používá k vytvoření špionážní instance abstraktní třídy.
Krok 1: Vytvořte abstraktní třídu s názvem Abstract1_class, která obsahuje jak abstraktní, tak neabstraktní metody.
Abstract1_class.java
bublinové řazení v Javě
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
Krok 2: Vytvořte testovací případ JUnit s názvem Abstrakt1 Test . Obsahuje špionážní instanci abstraktní třídy.
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); } }
Výstup
Následující výstup ukazuje, že test probíhá úspěšně.
Nevýhodou použití metody Mockito.spy() je, že při vytváření instance spy vyvolá konstruktor abstraktní třídy. Ve většině případů konstruktor používá externí závislosti, které mohou být překážkou pro provádění našich testů jednotek. Tyto externí závislosti jsou obvykle známé jako zkušební překážky . To je důvod, proč používat metodu Mockito.mock() pro zesměšňování abstraktních tříd.
2. Zesměšňování abstraktní třídy pomocí Mockito.mock()
V tomto příkladu se pokusíme zesměšnit abstraktní třídy pomocí metody Mockito.mock().
Obvykle se zesměšňování používá k vytvoření klonu nebo fiktivního objektu třídy. Jinými slovy, uvolňuje třídu z její logiky nebo algoritmů. Vytvořená mock instance neobsahuje kód (logiku) uvnitř metod.
Krok 1: Vytvořte abstraktní třídu s názvem Abstract_Class, která obsahuje jak abstraktní, tak neabstraktní metody.
relační algebra v rdbms
Abstract_Class.java
public abstract class Abstract_Class { public String sayMock() { return 'Hii.. ' + getName() + symbol() ; } private String symbol() { return '!!'; } protected abstract String getName(); }
Krok 2: Vytvořte testovací případ JUnit s názvem AbstractTestClass za zesměšňování abstraktní třídy.
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()); } }
Ve výše uvedeném kódu a je simulovaná instance vytvořená pomocí metody Mockito.mock().
Výstup
Následující výstup ukazuje, že test úspěšně běží pomocí Mockito.
Výše uvedený přístup není nejlepší, ale lze jej použít. Další přístup se doporučuje, protože používá PowerMock a může mít kontrolu nad soukromými metodami definovanými v abstraktních třídách.
3. Zesměšňování abstraktní třídy pomocí PowerMock
V následujícím příkladu použijeme metodu PowerMockito.mock() pro zesměšňování abstraktních tříd. Použití PowerMock místo Mockito.mock() je lepší přístup, protože může mít kontrolu nad soukromými i statickými metodami.
Krok 1: Vytvořte abstraktní třídu s názvem Abstraktní_třída který obsahuje jak abstraktní, tak neabstraktní metody.
Abstract_class.java
public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } }
Krok 2: Vytvořte testovací případ JUnit s názvem AbstractTestClass pro testovací účely.
AbstractTestClass.java
java objekt
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); } }
Výstup
Následující výstup ukazuje, že test úspěšně běží pomocí PowerMock s Mockito.