logo

Špehování nebo zesměšňování abstraktních tříd

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ě.

Špehování nebo zesměšňování abstraktních tříd

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.

Špehování nebo zesměšňování abstraktních tříd

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); } } 
Zde jsme požádali PowerMock, aby zablokoval návratové hodnoty soukromé metody, abychom mohli testovat metodu sayMock() bez jakýchkoliv testovacích překážek. Mockito samo o sobě nemůže tuto metodu potlačit, proto jsme spolu s Mockito použili PowerMock.

Výstup

Následující výstup ukazuje, že test úspěšně běží pomocí PowerMock s Mockito.

Špehování nebo zesměšňování abstraktních tříd