Java 如何使用mockito/powermockito模拟IamRequest impl类?
IamRequestImpl.javaJava 如何使用mockito/powermockito模拟IamRequest impl类?,java,junit,mockito,powermock,powermockito,Java,Junit,Mockito,Powermock,Powermockito,IamRequestImpl.java public class IamRequestImpl<E> extends IamRequest { public IamRequestImpl(Iam iam, String s, String s1, Object o, Class aClass) { super(iam, s, s1, o, aClass); } } 公共类IamRequestImpl扩展IamRequest{ 公共Iam请求impl(
public class IamRequestImpl<E> extends IamRequest {
public IamRequestImpl(Iam iam, String s, String s1, Object o, Class aClass) {
super(iam, s, s1, o, aClass);
}
}
公共类IamRequestImpl扩展IamRequest{
公共Iam请求impl(Iam Iam,字符串s,字符串s1,对象o,类aClass){
超级(iam、s、s1、o、aClass);
}
}
GcsHelper.java
public <T> T getServiceAccountKey(IamRequestInitializer req, Iam iam, String requestString,
String api) throws IOException {
IamRequestImpl<String> iamRequestImpl= new IamRequestImpl<String>(iam, HttpMethods.POST, requestString, String.class,
ServiceAccountKey.class);
iamRequestImpl.setKey(api);
iamRequestImpl.setFields(SchedulerConstants.JSON_KEY_FIELDS);
req.initializeJsonRequest(iamRequestImpl);
return (T) request.execute();
}
public T getServiceAccountKey(Iam请求初始值设定项req、Iam Iam、字符串请求字符串、,
字符串api)引发IOException{
IamRequestImpl IamRequestImpl=新IamRequestImpl(iam,HttpMethods.POST,requestString,String.class,
ServiceAccountKey.class);
iamRequestImpl.setKey(api);
iamRequestImpl.setFields(SchedulerConstants.JSON_KEY_字段);
请求初始化请求(iamRequestImpl);
return(T)request.execute();
}
GCSHelperTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest({ IamRequestImpl.class, ServiceAccountKey.class})
@Test
public void testGetServiceAccountKeyOnSuccess() throws Exception{
IamRequestInitializer mockIamRequestInitializer = Mockito.mock(IamRequestInitializer.class);
IamRequestImpl<String> mockIamRequestImpl = PowerMockito.mock(IamRequestImpl.class);
PowerMockito.whenNew(IamRequestImpl.class).withAnyArguments().thenReturn(mockIamRequestImpl);
when(mockIamRequestImpl.setKey("apiKey")).thenReturn(mockIamRequestImpl);
when(mockIamRequestImpl.setFields("apiKey")).thenReturn(mockIamRequestImpl);
Mockito.doNothing().when(mockIamRequestInitializer).initializeJsonRequest(mockIamRequestImpl);
spyGCSUtils.getServiceAccountKey(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
}
@RunWith(PowerMockRunner.class)
@PrepareForTest({IamRequestImpl.class,ServiceAccountKey.class})
@试验
public void testGetServiceAccountKeyOnSuccess()引发异常{
IamRequestInitializer mockIamRequestInitializer=Mockito.mock(IamRequestInitializer.class);
IamRequestImpl mockIamRequestImpl=PowerMockito.mock(IamRequestImpl.class);
PowerMockito.whenNew(IamRequestImpl.class).withAnyArguments()。然后返回(mockIamRequestImpl);
当(mokiamrequestimpl.setKey(“apiKey”))时,返回(mokiamrequestimpl);
when(mockIamRequestImpl.setFields(“apiKey”)。然后返回(mockIamRequestImpl);
Mockito.doNothing().when(mockIamRequestInitializer).initializeJsonRequest(mockIamRequestImpl);
getServiceAccountKey(Mockito.any(),Mockito.any(),Mockito.any(),Mockito.any(),Mockito.any());
}
当运行
testGetServiceAccountKeyOnSuccess
时,面向nullpointerException的测试用例,因为iamRequestImpl
不是模拟 尝试将Mockito.any()
转换为特定的对象
,如下所示
spyGCSUtils.getServiceAccountKey((IamRequestInitializer)Mockito.any(), (Iam)Mockito.any(), Mockito.anyString(), Mockito.anyString());
由于
getServiceAccountKey(IamRequestInitializer,Iam,String,String)
这看起来基本上是一个结构,您不应该首先模拟它。那么我如何为这个场景编写测试用例呢?给它真正的字符串和对象,这就是为什么。它需要一些机密信息,比如API密钥等,我们作为开发人员无法访问这些信息。在这种情况下我如何继续?然后在构造函数中将这些位模拟为参数,但不要模拟IamRequestImpl本身。或者只是使用完全虚假的数据,而不是真实的API密钥,至少是真实的字符串对象。