PowerMock으로 void를 반환하는 정적 메서드를 어떻게 모의합니까?
내 프로젝트에 몇 가지 정적 util 메서드가 있으며 그중 일부는 예외를 전달하거나 throw합니다. void가 아닌 반환 유형을 가진 정적 메서드를 모의하는 방법에 대한 많은 예제가 있습니다. 그러나 void를 " doNothing()
"로 반환하는 정적 메서드를 어떻게 모의 할 수 있습니까?
비 void 버전은 다음 코드 줄을 사용합니다.
@PrepareForTest(StaticResource.class)
...
PowerMockito.mockStatic(StaticResource.class);
...
Mockito.when(StaticResource.getResource("string")).thenReturn("string");
A를 적용하지만 경우에 StaticResources
그 반환 void
, 그 불평 컴파일은 when(T)
무효 적용 할 수 없습니다 ...
어떤 아이디어?
해결 방법은 모든 정적 메서드 Boolean
가 성공을 위해 일부 를 반환하도록하는 것일 수 있지만 해결 방법이 마음에 들지 않습니다.
실제 인스턴스에서 Mockito를 사용하는 것과 동일한 방식으로 수행 할 수 있습니다. 예를 들어 스텁을 연결할 수 있습니다. 다음 줄은 첫 번째 호출이 아무 작업도 수행하지 않도록하고 두 번째 및 이후 호출 getResources
은 예외를 throw합니다.
// the stub of the static method
doNothing().doThrow(Exception.class).when(StaticResource.class);
StaticResource.getResource("string");
// the use of the mocked static code
StaticResource.getResource("string"); // do nothing
StaticResource.getResource("string"); // throw Exception
Matt Lachman의 발언 덕분에 모의 생성 시간에 기본 답변이 변경되지 않으면 모의는 기본적으로 아무 작업도 수행하지 않습니다. 따라서 다음 코드를 작성하는 것은 작성하지 않는 것과 같습니다.
doNothing().doThrow(Exception.class).when(StaticResource.class);
StaticResource.getResource("string");
그렇긴하지만이 특정 코드에 대해 아무것도 기대하지 않는 테스트를 읽는 동료에게는 흥미로울 수 있습니다. 물론 이것은 테스트의 이해도 에 따라 조정될 수 있습니다 .
그건 그렇고, 내 겸손한 의견으로는 새 코드를 작성하는 경우 정적 코드를 조롱하지 않아야합니다. Mockito에서 우리는 그것이 일반적으로 나쁜 디자인에 대한 힌트라고 생각하며, 유지 관리가 잘되지 않는 코드로 이어질 수 있습니다. 기존 레거시 코드는 또 다른 이야기입니다.
일반적으로 비공개 또는 정적 메서드를 모의해야하는 경우이 메서드는 너무 많은 작업을 수행하므로 테스트 된 개체에 삽입 될 개체에서 외부화되어야합니다.
도움이되기를 바랍니다.
문안 인사
다음 과 같이 정적 void 메서드를 스텁 할 수 있습니다 .
PowerMockito.doNothing().when(StaticResource.class, "getResource", anyString());
왜 귀찮게하는지 모르겠지만 mockStatic (StaticResource.class) 를 호출 할 때 StaticResource의 모든 정적 메서드가 기본적으로 스텁 처리 되기 때문입니다.
더 유용한 것은 다음과 같이 StaticResource.getResource ()에 전달 된 값을 캡처 할 수 있다는 것입니다.
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
PowerMockito.doNothing().when(
StaticResource.class, "getResource", captor.capture());
그런 다음 다음과 같이 StaticResource.getResource에 전달 된 문자열을 평가할 수 있습니다.
String resourceName = captor.getValue();
간단히 말해서, 아래 줄에 모의를 원한다고 상상해보십시오.
StaticClass.method();
그런 다음 아래에 코드 줄을 작성하여 모의합니다.
PowerMockito.mockStatic(StaticClass.class);
PowerMockito.doNothing().when(StaticClass.class);
StaticClass.method();
예를 들어 void를 반환하는 정적 메서드를 모의하려면 Fileutils.forceMKdir(File file),
샘플 코드 :
File file =PowerMockito.mock(File.class);
PowerMockito.doNothing().when(FileUtils.class,"forceMkdir",file);
'IT Share you' 카테고리의 다른 글
어떤 프로토콜? (0) | 2020.12.08 |
---|---|
변경 가능한 해시 맵 키는 위험한 행위입니까? (0) | 2020.12.07 |
Youtube 비디오를 부트 스트랩 3.0 페이지에 올바르게 포함 (0) | 2020.12.07 |
Windows XP에 JDK8 설치-advapi32.dll 오류 (0) | 2020.12.07 |
Angular JS에서 Bootstrapping은 무엇을 의미합니까? (0) | 2020.12.07 |