logo

Шпигунство або висміювання абстрактних класів

Абстрактні класи називаються класами, оголошеними за допомогою ключового слова abstract, які можуть включати або не включати абстрактні методи. У 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); } } 

Вихід

Наступний результат показує, що тест успішно виконано.

bash об'єднує рядки
Шпигунство або висміювання абстрактних класів

Недоліком використання методу Mockito.spy() є те, що він викликає конструктор абстрактного класу під час створення екземпляра шпигуна. У більшості випадків конструктор використовує зовнішні залежності, які можуть бути перешкодою для виконання наших модульних тестів. Ці зовнішні залежності зазвичай називаються тестові перешкоди . Це причина використовувати метод Mockito.mock() для знущання над абстрактними класами.

2. Знущання над абстрактним класом за допомогою Mockito.mock()

У цьому прикладі ми будемо імітувати абстрактні класи за допомогою методу Mockito.mock().

Зазвичай mocking використовується для створення клону або фіктивного об’єкта класу. Іншими словами, це робить клас вакантним для його логіки або алгоритмів. Створений макет не містить коду (логіки) всередині методів.

Крок 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.

Шпигунство або висміювання абстрактних класів