如何使用具有多个参数的 Mockito 模拟 setter 方法
How to mock a setter method using Mockito that has multiple parameters
我的问题是如何使用 Mockito 的 doAnswer 调用原始方法并使用我自己的测试参数。使事情复杂化的是,其中一个参数不是原语。这是一个习俗 class.
鉴于以下情况:
public class EnvironmentQualityStatus {
public int environmentQuality = EnvironmentQualityStatus.NA;
public long cht = -1;
public int environmentSubType = -1;
public String engineer="";
public int engineerType = -1;
public long timeStamp = 0;
public static final String version = "tpv1";
EnvironmentQualityStatus(){}
EnvironmentQualityStatus(int environmentQuality, long cht, int environmentSubType, String engineer, int engineerType) {
this.environmentQuality = environmentQuality;
this.cht = cht;
this.environmentSubType = environmentSubType;
this.engineer = engineer;
this.engineerType = engineerType;
timeStamp = System.currentTimeMillis();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("ts: ");
sb.append(timeStamp);
sb.append(", quality: ");
sb.append(EnvironmentQualityStatus.valueOf(environmentQuality));
sb.append(", cht: ");
sb.append(cht);
sb.append(", type: ");
if (engineerType == Engineers.TYPE_CIVIL) {
sb.append(“civil”);
} else if (engineerType == Engineers.TYPE_INDUSTRIAL) {
sb.append(“industrial”);
if (!TextUtils.isEmpty(engineer)) {
sb.append(", Engineer: ");
sb.append(engineer);
}
} else {
sb.append("n/a");
}
return sb.toString();
}
}
使用上面的代码在 class 中设置一些东西。我想使用 Mockito 模拟的就是这个调用(以及其他类似的调用)。
public class EnvironmentQuality {
...
public void updateEnvironmentQuality(EnvironmentQualityStatus eqStatus ,
int environmentQuality ,int cht , String engineer, boolean notify ){
//set some stuff....
}
}
我知道使用 Mockito 的 doAnswer 是执行此操作的正确方法。我只是不知道如何连接最后一部分,在那里我用自己的值操纵被调用的值,以便在 test-运行-time 时使用它们的程序获得我的值。我已经阅读了 Mockito 文档以及围绕该主题的一些 SO 帖子,但我仍然不清楚。
EnvironmentQuality environmentQuality = spy((EnvironmentQuality)EnvironmentQuality.getInstance(context));
spy(environmentQuality).updateNetworkQuality(Mockito.any(com.something.internal.EnvironmentQualityStatus.class), anyInt(), anyInt(), anyString(), anyBoolean());
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
//This is an example of how to spy the parameters that were passed.
EnvironmentQualityStatus status = (EnvironmentQualityStatus)invocation.getArguments()[0];
int environmentQuality = (int)invocation.getArguments()[1];
int cht = (int)invocation.getArguments()[2];
String engineer = (String)invocation.getArguments()[3];
boolean notify = (boolean)invocation.getArguments()[4];
//But how to customize the parameters so that every time updateEnvironmentQuality(...) is called, a test can customize the params and dynamically influence the values.
return null;
}
}).when(environmentQuality).updateEnvironmentQuality(Mockito.any(com.something.internal.EnvironmentQualityStatus.class), anyInt(), anyInt(), anyString(), anyBoolean());
所以我假设您想用其他值调用该方法。通过检查 InvocationOnMock
的 the documentation,您可以检查如何获取 Method
和被调用的 Object
。所以这应该很容易修改:
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object callingObject = invocation.getMock();
Method method = invocation.getMethod();
method.invoke(callingObject, /* arguments... */);
return null;
}
我的问题是如何使用 Mockito 的 doAnswer 调用原始方法并使用我自己的测试参数。使事情复杂化的是,其中一个参数不是原语。这是一个习俗 class.
鉴于以下情况:
public class EnvironmentQualityStatus {
public int environmentQuality = EnvironmentQualityStatus.NA;
public long cht = -1;
public int environmentSubType = -1;
public String engineer="";
public int engineerType = -1;
public long timeStamp = 0;
public static final String version = "tpv1";
EnvironmentQualityStatus(){}
EnvironmentQualityStatus(int environmentQuality, long cht, int environmentSubType, String engineer, int engineerType) {
this.environmentQuality = environmentQuality;
this.cht = cht;
this.environmentSubType = environmentSubType;
this.engineer = engineer;
this.engineerType = engineerType;
timeStamp = System.currentTimeMillis();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("ts: ");
sb.append(timeStamp);
sb.append(", quality: ");
sb.append(EnvironmentQualityStatus.valueOf(environmentQuality));
sb.append(", cht: ");
sb.append(cht);
sb.append(", type: ");
if (engineerType == Engineers.TYPE_CIVIL) {
sb.append(“civil”);
} else if (engineerType == Engineers.TYPE_INDUSTRIAL) {
sb.append(“industrial”);
if (!TextUtils.isEmpty(engineer)) {
sb.append(", Engineer: ");
sb.append(engineer);
}
} else {
sb.append("n/a");
}
return sb.toString();
}
}
使用上面的代码在 class 中设置一些东西。我想使用 Mockito 模拟的就是这个调用(以及其他类似的调用)。
public class EnvironmentQuality {
...
public void updateEnvironmentQuality(EnvironmentQualityStatus eqStatus ,
int environmentQuality ,int cht , String engineer, boolean notify ){
//set some stuff....
}
}
我知道使用 Mockito 的 doAnswer 是执行此操作的正确方法。我只是不知道如何连接最后一部分,在那里我用自己的值操纵被调用的值,以便在 test-运行-time 时使用它们的程序获得我的值。我已经阅读了 Mockito 文档以及围绕该主题的一些 SO 帖子,但我仍然不清楚。
EnvironmentQuality environmentQuality = spy((EnvironmentQuality)EnvironmentQuality.getInstance(context));
spy(environmentQuality).updateNetworkQuality(Mockito.any(com.something.internal.EnvironmentQualityStatus.class), anyInt(), anyInt(), anyString(), anyBoolean());
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
//This is an example of how to spy the parameters that were passed.
EnvironmentQualityStatus status = (EnvironmentQualityStatus)invocation.getArguments()[0];
int environmentQuality = (int)invocation.getArguments()[1];
int cht = (int)invocation.getArguments()[2];
String engineer = (String)invocation.getArguments()[3];
boolean notify = (boolean)invocation.getArguments()[4];
//But how to customize the parameters so that every time updateEnvironmentQuality(...) is called, a test can customize the params and dynamically influence the values.
return null;
}
}).when(environmentQuality).updateEnvironmentQuality(Mockito.any(com.something.internal.EnvironmentQualityStatus.class), anyInt(), anyInt(), anyString(), anyBoolean());
所以我假设您想用其他值调用该方法。通过检查 InvocationOnMock
的 the documentation,您可以检查如何获取 Method
和被调用的 Object
。所以这应该很容易修改:
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object callingObject = invocation.getMock();
Method method = invocation.getMethod();
method.invoke(callingObject, /* arguments... */);
return null;
}