java junit PowerMock
유닛 테스트 시 뮬 레이 션 프레임 워 크 의 기능 및 구현 안내
Mockito 는 자바 에 대한 유닛 테스트 시 뮬 레이 션 프레임 워 크 로 Easy Mock 과 jMock 과 비슷 하 며 유닛 테스트 과정 에서 문맥(또는 테스트 구동 함수 및 말뚝 함수 라 고 함)의 구축 을 간소화 하기 위해 개 발 된 도구 입 니 다.이러한 아 날로 그 프레임 워 크 가 있 기 전에 특정한 함수 의 유닛 테스트 를 작성 하기 위해 프로그래머 는 테스트 함수 에 사 용 된 환경 변수 와 다른 모듈 의 인터페이스 가 예상 치 를 되 돌 릴 수 있 도록 매우 번 거 로 운 초기 화 작업 을 해 야 합 니 다.어떤 때 는 단원 테스트 의 타당 성 을 위해 테스트 코드 자체 의 구 조 를 희생 해 야 합 니 다.유닛 테스트 시 뮬 레이 션 프레임 워 크 는 유닛 테스트 의 작성 과정 을 크게 간소화 합 니 다.테스트 코드 가 일부 인 터 페 이 스 를 호출 해 야 할 때 가짜 인 터 페 이 스 를 직접 모 의 하고 이 인 터 페 이 스 를 임의로 지정 합 니 다.이렇게 하면 단원 테스트 의 효율 과 단원 테스트 코드 의 가 독성 을 크게 향상 시 킬 수 있다.
PowerMock 도 하나의 유닛 테스트 시 뮬 레이 션 프레임 워 크 로 다른 유닛 테스트 시 뮬 레이 션 프레임 워 크 를 바탕 으로 확장 되 었 습 니 다.맞 춤 형 클래스 로 더 와 일부 바이트 코드 변경 기법 을 제공 하 는 응용 을 통 해 PowerMock 은 정적 방법,구조 방법,개인 적 인 방법 과 Final 방법 에 대한 모 의 지원,정적 초기 화 과정 에 대한 제거 등 강력 한 기능 을 나 타 냈 다.PowerMock 은 확장 기능 을 사용 할 때 확 장 된 프레임 워 크 와 같은 API 를 완전히 사용 하기 때문에 PowerMock 이 지원 하 는 아 날로 그 프레임 워 크 를 잘 아 는 개발 자 는 PowerMock 이 매우 쉽게 시작 할 수 있다 는 것 을 알 게 될 것 입 니 다.PowerMock 의 목적 은 현재 익숙 한 인터페이스 에 아주 적은 방법 과 주석 을 추가 하여 추가 기능 을 실현 하 는 것 입 니 다.현재 PowerMock 은 Easy Mock 과 Mockito 만 지원 합 니 다.
환경 설정 방법
필요 한 개발 패키지 에 대해 PowerMock 사 이 트 는'원 스 톱'다운 로드 를 제공 합 니 다.이 페이지 에서 PowerMock 1.4.10 with Mockito and JUnit including dependencies 와 같은 링크 를 선택 하 십시오.이 패키지 에는 최신 JUnit 라 이브 러 리,Mockito 라 이브 러 리,PowerMock 라 이브 러 리 와 관련 된 의존 도가 포함 되 어 있 습 니 다.
이 클립 스 를 사용 하여 개발 하 는 경우 이 클립 스 프로젝트 에 이 라 이브 러 리 파일 을 포함 하면 됩 니 다.
Maven 개발 을 사용 하려 면 버 전에 따라 다음 목록 내용 을 POM 파일 에 추가 해 야 합 니 다.
JUnit 버 전 4.4 이상 리스트 1 참조
명세서
1.4.10
org.powermock
powermock-module-junit4
${powermock.version}
test
org.powermock
powermock-api-mockito
${powermock.version}
test
JUnit 버 전 4.0-4.3 리스트 2 참조,
명세서
1.4.10
org.powermock
powermock-module-junit4-legacy
${powermock.version}
test
org.powermock
powermock-api-mockito
${powermock.version}
test
JUnit 버 전 3 은 리스트 3 을 참고 하 세 요.
명세서
1.4.10
org.powermock
powermock-module-junit3
${powermock.version}
test
org.powermock
powermock-api-mockito
${powermock.version}
test
PowerMock 유닛 테스트 에서 의 응용
아 날로 그 Static 방법
PowerMock 을 사용 할 클래스 가 시작 되 기 전에 다음 과 같은 성명 을 해 야 합 니 다.
@RunWith(PowerMockRunner.class)
그리고 테스트 가 필요 한 정적 방법 을 PowerMock 에 주석 으로 제공 해 야 합 니 다.
@PrepareForTest( { YourClassWithEgStaticMethod.class })
그리고 테스트 코드 를 쓰기 시작 할 수 있 습 니 다.
우선,목록 4 와 같은 static 방법 을 포함 한 코드 가 필요 합 니 다.
명세서
public class IdGenerator {
...
public static long generateNewId() {
...
}
...
}
그 다음 에 테스트 코드 에서 상기 방법 을 인용 했다.예 를 들 어 목록 5 와 같다.
명세서
public class ClassUnderTest {
...
public void methodToTest() {
..
final long id = IdGenerator.generateNewId();
..
}
...
}
유닛 테스트 의 목적 을 달성 하기 위해 서 는 정적 방법
generateNewId()
을 여러 가지 값 으로 되 돌려 테스트 방법methodToTest()
에 대한 커버 테스트 를 달성 해 야 합 니 다.실현 방식 은 목록 6 과 같 습 니 다.명세서
@RunWith(PowerMockRunner.class)
//We prepare the IdGenerator for test because the static method is normally not mockable
@PrepareForTest(IdGenerator.class)
public class MyTestClass {
@Test
public void demoStaticMethodMocking() throws Exception {
mockStatic(IdGenerator.class);
/*
* Setup the expectation using the standard Mockito syntax,
* generateNewId() will now return 2 everytime it's invoked
* in this test.
*/
when(IdGenerator.generateNewId()).thenReturn(2L);
new ClassUnderTest().methodToTest();
// Optionally verify that the static method was actually called
verifyStatic();
IdGenerator.generateNewId();
}
}
목록 6 에서 보 여 준 바 와 같이 테스트 코드 에 서 는
When().thenReturn(
문 구 를 사용 하여 인 용 된 정적 방법 을 지정 하여 필요 한 값 을 되 돌려 덮어 쓰기 테스트 효 과 를 얻 을 수 있 습 니 다.아 날로 그 구조 함수
가끔 은 구조 함 수 를 모 의 하여 테스트 코드
new
에서 작업 을 되 돌려 주 는 대상 을 임의로 맞 출 수 있 고 유닛 테스트 의 효율 을 어느 정도 향상 시 킬 수 있 습 니 다.예 를 들 어 리스트 7 의 코드 를 고려 할 수 있 습 니 다.명세서
public class DirectoryStructure {
public boolean create(String directoryPath) {
File directory = new File(directoryPath);
if (directory.exists()) {
throw new IllegalArgumentException(
"\"" + directoryPath + "\" already exists.");
}
return directory.mkdirs();
}
}
create()
함 수 를 충분히 테스트 하기 위해 서 는new
나 온 File 대상 에 의 해 파일 존재 와 존재 하지 않 는 두 가지 결 과 를 되 돌려 주어 야 합 니 다.PowerMock 이 나타 나 기 전에 이 단원 테스트 를 실현 하 는 방식 은 보통 실제 파일 시스템 에서 해당 하 는 경로 와 파일 을 만들어 야 합 니 다.그러나 PowerMock 의 도움 을 받 아 본 함수 의 테스트 는 실제 파일 시스템 과 철저히 독립 될 수 있 습 니 다.PowerMock 을 사용 하여 File 류 의 구조 함 수 를 모 의 하여 실제 File 대상 이 아 닌 지 정 된 아 날로 그 File 대상 으로 돌아 가게 한 다음 에 지 정 된 아 날로 그 File 대상 을 수정 하면 테스트 코드 에 대한 덮어 쓰기 테스트 를 실현 할 수 있 습 니 다.목록 8 과 같은 코드 참조:명세서
@RunWith(PowerMockRunner.class)
@PrepareForTest(DirectoryStructure.class)
public class DirectoryStructureTest {
@Test
public void createDirectoryStructureWhenPathDoesntExist() throws Exception {
final String directoryPath = "mocked path";
File directoryMock = mock(File.class);
// This is how you tell PowerMockito to mock construction of a new File.
whenNew(File.class).withArguments(directoryPath).thenReturn(directoryMock);
// Standard expectations
when(directoryMock.exists()).thenReturn(false);
when(directoryMock.mkdirs()).thenReturn(true);
assertTrue(new NewFileExample().createDirectoryStructure(directoryPath));
// Optionally verify that a new File was "created".
verifyNew(File.class).withArguments(directoryPath);
}
}
whenNew().withArguments().thenReturn()
문 구 를 사용 하면 구체 적 인 유형의 구조 함수 에 대한 시 뮬 레이 션 을 실현 할 수 있다.그 다음 에 이전에 만 든 아 날로 그 대상directoryMock
에 대해When().thenReturn()
문 구 를 사용 하면 필요 한 모든 기능 을 실현 하여 테스트 대상 에 대한 커버 테스트 를 실현 할 수 있다.이 테스트 에서 실제 시 뮬 레이 션 은 클래스DirectoryStructureTest
에서 이 루어 지기 때문에 지정 해 야 할@PrepareForTest
대상 은DirectoryStructureTest.class
이다.개인 및 Final 방법 시 뮬 레이 션
이러한 개인 적 인 방법 이나 Final 방법 에 대한 시 뮬 레이 션 을 실현 하기 위해 PowerMock 이 제공 하 는 또 다른 기술:부분 적 인 시 뮬 레이 션 이 필요 합 니 다.
이전에 소 개 된 시 뮬 레이 션 작업 에서 우 리 는 항상 전체 클래스 나 대상 을 모 의 한 다음 에
When().thenReturn()
문 구 를 사용 하여 그 중에서 관심 을 가 질 만 한 일부 함수 의 반환 치 를 지정 하여 각종 테스트 환경 을 구축 하 는 목 표를 달성 했다.When().thenReturn()
방법 으로 지정 하지 않 은 함수 에 대해 시스템 은 각종 유형의 기본 값 을 되 돌려 줍 니 다(구체 적 인 값 은 공식 문 서 를 참고 할 수 있 습 니 다).부분 시 뮬 레이 션 은 다른 방식 을 제공 합 니 다.부분 시 뮬 레이 션 을 사용 할 때 만들어 진 시 뮬 레이 션 대상 은 여전히 원래 시스템 대상 입 니 다.방법
When().thenReturn()
을 사용 하여 구체 적 인 방법의 반환 값 을 지정 할 수 있 지만 이 함수 로 수정 되 지 않 은 함 수 는 시스템 원시 류 의 방식 으로 실 행 됩 니 다.이러한 부분 시 뮬 레이 션 방식 의 강 한 점 은 일반적인 방법 을 제외 하고 Final 방법 은 개인 적 인 방법 과 마찬가지 로 사용 할 수 있다 는 것 이다.
목록 9 과 같은 테스트 코드 참조:
명세서
public final class PrivatePartialMockingExample {
public String methodToTest() {
return methodToMock("input");
}
private String methodToMock(String input) {
return "REAL VALUE = " + input;
}
}
단원 테스트 의 순결 성 을 유지 하기 위해 테스트 방법
methodToTest()
에서 우 리 는 사유 함수methodToMock()
가 실현 하 는 방 해 를 받 고 싶 지 않다.이 목적 을 달성 하기 위해 우 리 는 방금 언급 한 부분 시 뮬 레이 션 방법 으로 실현 한다.실현 방식 은 리스트 10 과 같다.명세서
@RunWith(PowerMockRunner.class)
@PrepareForTest(PrivatePartialMockingExample.class)
public class PrivatePartialMockingExampleTest {
@Test
public void demoPrivateMethodMocking() throws Exception {
final String expected = "TEST VALUE";
final String nameOfMethodToMock = "methodToMock";
final String input = "input";
PrivatePartialMockingExample underTest = spy(new PrivatePartialMockingExample());
/*
* Setup the expectation to the private method using the method name
*/
when(underTest, nameOfMethodToMock, input).thenReturn(expected);
assertEquals(expected, underTest.methodToTest());
// Optionally verify that the private method was actually called
verifyPrivate(underTest).invoke(nameOfMethodToMock, input);
}
}
부분 시 뮬 레이 션 을 실현 하기 위해 시 뮬 레이 션 대상 을 만 드 는 함수 가
mock()
에서spy()
로 바 뀌 었 고 조작 대상 도 유형 자체 에서 구체 적 인 대상 으로 바 뀌 었 음 을 알 수 있다.이 동시에When()
함수 도 서로 다른 버 전 을 사용 했다.개인 적 인 방법 이나 Final 방법 을 모 의 할 때When()
함 수 는 아 날로 그 대상,지 정 된 함수 이름 과 이 함수 에 대한 입력 매개 변수 목록 을 순서대로 지정 해 야 한다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.