logo

Шпиониране или подиграване на абстрактни класове

Абстрактните класове се наричат ​​клас, деклариран с абстрактната ключова дума, която може или не може да включва абстрактните методи. В Java абстрактните класове не могат да бъдат създадени, но могат да бъдат подкласирани. Може също да има статични полета и статични методи.

В този раздел ще обсъдим подиграването или шпионирането на абстрактни класове. Ще анализираме няколко случая на тестване на абстрактни класове с помощта на неабстрактни методи.

За шпиониране или подиграване на абстрактните класове, трябва да добавим следните зависимости на Maven:

  • JUnit
  • Мокито
  • PowerMock

Всички необходими зависимости на проекта са дадени по-долу:

 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 са необходими само за теста, в който използваме PowerMock.

Примери за осмиване на абстрактен клас

1. Шпиониране на абстрактен клас с помощта на Mockito.spy()

В този пример ще шпионираме абстрактните класове с помощта на метода Mockito.spy(). Методът Mockito.spy() се използва за създаване на шпионски екземпляр на абстрактния клас.

Етап 1: Създайте абстрактен клас с име Abstract1_class, който съдържа както абстрактни, така и неабстрактни методи.

Abstract1_class.java

 public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } } 

Стъпка 2: Създайте JUnit тестов случай с име Анотация1Тест . Той съдържа шпионски екземпляр на абстрактния клас.

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); } } 

Изход

Следният резултат показва, че тестът се изпълнява успешно.

Шпиониране или подиграване на абстрактни класове

Недостатъкът на използването на метода Mockito.spy() е, че той ще извика конструктора на абстрактния клас по време на създаването на шпионски екземпляр. В повечето случаи конструкторът използва външни зависимости, които могат да бъдат пречка за изпълнението на нашите модулни тестове. Тези външни зависимости обикновено са известни като тестови пречки . Това е причината да използваме метода Mockito.mock() за подигравка на абстрактни класове.

2. Подигравка на абстрактен клас с помощта на Mockito.mock()

В този пример ще се подиграваме на абстрактните класове с помощта на метода Mockito.mock().

изпитване и видове изпитване

Обикновено подигравката се използва за създаване на клонинг или фиктивен обект на класа. С други думи, той прави клас свободен от своята логика или алгоритми. Създаденият макет екземпляр не съдържа код (логика) в методите.

Етап 1: Създайте абстрактен клас с име Abstract_Class, който съдържа както абстрактни, така и неабстрактни методи.

Abstract_Class.java

 public abstract class Abstract_Class { public String sayMock() { return 'Hii.. ' + getName() + symbol() ; } private String symbol() { return '!!'; } protected abstract String getName(); } 

Стъпка 2: Създайте JUnit тестов случай с име AbstractTestClass за подигравка с абстрактния клас.

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()); } } 

В горния код, и е подиграван екземпляр, създаден с помощта на метода Mockito.mock().

Изход

Следният резултат показва, че тестът се изпълнява успешно с помощта на Mockito.

Шпиониране или подиграване на абстрактни класове

Горният подход не е най-добрият, но може да се използва. Следващият подход се препоръчва, защото използва PowerMock и може да има контрол върху частните методи, дефинирани в абстрактните класове.

3. Подигравка на абстрактен клас с помощта на PowerMock

В следващия пример ще използваме метода PowerMockito.mock() за подигравка на абстрактните класове. Използването на PowerMock вместо Mockito.mock() е по-добър подход, тъй като може да има контрол върху частните, както и върху статичните методи.

Етап 1: Създайте абстрактен клас с име Абстрактен_клас който съдържа както абстрактни, така и неабстрактни методи.

Abstract_class.java

 public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } } 

Стъпка 2: Създайте JUnit тестов случай с име AbstractTestClass за тестови цели.

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); } } 
Тук сме помолили PowerMock да заглуши връщаните стойности на частния метод, така че да можем да тестваме метода sayMock() без каквито и да е тестови пречки. Само Mockito не може да заглуши този метод, затова използвахме PowerMock заедно с Mockito.

Изход

Следният резултат показва, че тестът се изпълнява успешно с помощта на PowerMock с Mockito.

Шпиониране или подиграване на абстрактни класове