추상 클래스는 추상 메서드를 포함하거나 포함하지 않을 수 있는 abstract 키워드로 선언된 클래스를 말합니다. Java에서는 추상 클래스를 인스턴스화할 수 없지만 하위 클래스화할 수 있습니다. 또한 정적 필드와 정적 메서드를 가질 수도 있습니다.
이 섹션에서는 추상 클래스의 조롱 또는 감시에 대해 논의합니다. 비추상 메소드를 사용하여 추상 클래스를 테스트한 여러 사례를 분석해 보겠습니다.
추상 클래스를 감시하거나 조롱하려면 다음 Maven 종속성을 추가해야 합니다.
- JUnit
- 모키토
- 파워모크
프로젝트의 모든 필수 종속성은 다음과 같습니다.
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() 메서드는 추상 클래스의 스파이 인스턴스를 만드는 데 사용됩니다.
자바 int를 문자열로 변환
1 단계: 추상 및 비추상 메서드를 모두 포함하는 Abstract1_class라는 추상 클래스를 만듭니다.
Abstract1_class.java
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
2 단계: JUnit 테스트 케이스 생성 Abstract1테스트 . 여기에는 추상 클래스의 스파이 인스턴스가 포함되어 있습니다.
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 테스트 케이스 생성 AbstractTest클래스 추상 클래스를 조롱합니다.
자바의 기본 데이터 유형
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() 메서드를 사용합니다. Mockito.mock() 대신 PowerMock을 사용하는 것이 개인 메서드와 정적 메서드를 제어할 수 있으므로 더 나은 접근 방식입니다.
1 단계: 라는 추상 클래스를 만듭니다. Abstract_class 추상 메서드와 비추상 메서드가 모두 포함되어 있습니다.
str을 int로 변환하는 방법
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 테스트 케이스 생성 AbstractTest클래스 테스트 목적으로.
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); } }
산출
다음 출력은 Mockito와 함께 PowerMock을 사용하여 테스트가 성공적으로 실행되고 있음을 보여줍니다.