logo

추상 클래스 감시 또는 조롱

추상 클래스는 추상 메서드를 포함하거나 포함하지 않을 수 있는 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); } } 
여기서는 테스트 장애 없이 sayMock() 메서드를 테스트할 수 있도록 PowerMock에 개인 메서드의 반환 값을 스텁하도록 요청했습니다. Mockito만으로는 이 방법을 스텁할 수 없습니다. 이것이 바로 우리가 Mockito와 함께 PowerMock을 사용한 이유입니다.

산출

다음 출력은 Mockito와 함께 PowerMock을 사용하여 테스트가 성공적으로 실행되고 있음을 보여줍니다.

추상 클래스 감시 또는 조롱