IT Share you

PowerMock으로 void를 반환하는 정적 메서드를 어떻게 모의합니까?

shareyou 2020. 12. 7. 21:13
반응형

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);

참고 URL : https://stackoverflow.com/questions/9585323/how-do-i-mock-a-static-method-that-returns-void-with-powermock

반응형