PowerMockito 모의 단일 정적 메서드 및 반환 객체
m1과 m2의 2개의 정적 메서드를 포함하는 클래스에서 정적 메서드 m1을 조롱하고 싶습니다.그리고 메서드 m1이 오브젝트를 반환하고 싶다.
나는 다음을 시도했다.
1)
PowerMockito.mockStatic(Static.class, new Answer<Long>() {
@Override
public Long answer(InvocationOnMock invocation) throws Throwable {
return 1000l;
}
});
이것은 m1과 m2를 모두 호출하고 있으며 반환 타입이 다르기 때문에 반환 타입 불일치 에러가 발생합니다.
2)PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);
그러나 m1이 실행될 때는 호출되지 않습니다.
3)PowerMockito.mockPartial(Static.class, "m1");
컴파일러에 mockPartial을 사용할 수 없다는 오류가 나타납니다.이 에러는 http://code.google.com/p/powermock/wiki/MockitoUsage 에서 입수했습니다.
원하는 것은 1의 일부와 2의 모든 부분을 조합하는 것입니다.
PowerMockito.mockStatic을 사용하여 클래스의 모든 정적 메서드에 대해 정적 모킹을 활성화해야 합니다.즉, when-then Return 구문을 사용하여 스터브할 수 있습니다.
그러나 사용하고 있는 mockStatic의 2인수 오버로드로 인해 모크 인스턴스에서 명시적으로 stubbed하지 않은 메서드를 호출했을 때 Mockito/PowerMock이 수행해야 하는 기본 전략이 제공됩니다.
javadoc에서:
상호 작용에 대한 응답에 대해 지정된 전략으로 클래스 모크를 만듭니다.이것은 꽤 고도의 기능으로, 통상, 적절한 테스트를 작성하기 위해서 필요한 것은 아닙니다.다만, 레거시 시스템으로 작업할 때는 도움이 됩니다.이것은 기본 응답이므로 메서드콜을 stub하지 않을 때만 사용됩니다.
기본 스터브 전략은 오브젝트, 번호 및 부울 값 메서드에 대해 null, 0 또는 false만 반환하는 것입니다.2-arg 오버로드를 사용하면 "No, no, no, default use this Answer subclass' answer method를 사용하여 기본값을 가져옵니다.Long이 반환되므로 Long과 호환되지 않는 것을 반환하는 정적 메서드가 있으면 문제가 있습니다.
대신 mockStatic의 1-arg 버전을 사용하여 스태틱 방식의 스터브를 이노블로 한 후 when-then-Return을 사용하여 특정 방식에 대해 수행할 작업을 지정합니다.예를 들어 다음과 같습니다.
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
class ClassWithStatics {
public static String getString() {
return "String";
}
public static int getInt() {
return 1;
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
@Test
public void test() {
PowerMockito.mockStatic(ClassWithStatics.class);
when(ClassWithStatics.getString()).thenReturn("Hello!");
System.out.println("String: " + ClassWithStatics.getString());
System.out.println("Int: " + ClassWithStatics.getInt());
}
}
String-value static 메서드는 stubbed되어 "Hello!"가 반환됩니다.int-value static 메서드는 기본 stubbing을 사용하며 0이 반환됩니다.
언급URL : https://stackoverflow.com/questions/10583202/powermockito-mock-single-static-method-and-return-object
'it-source' 카테고리의 다른 글
vue.js 2에서 Larabel의 baseurl을 사용하려면 어떻게 해야 하나요? (0) | 2022.10.30 |
---|---|
여러 조인 시 tmp 테이블에 대한 MySQL 키 파일이 잘못됨 (0) | 2022.10.30 |
Vuex: 디스패치에서는 약속을 반환하여 체인으로 묶을 수 있습니까? (0) | 2022.10.30 |
입력 유형="텍스트"에서 원하는 대로 변경 사항을 추적하는 가장 좋은 방법은 무엇입니까? (0) | 2022.10.30 |
Visual Studio 코드 PHP Intlephense가 계속 필요하지 않은 오류를 표시함 (0) | 2022.10.30 |