如何在Mockito中更改字符串的默认返回值? [英] How do I change the default return value for Strings in Mockito?
问题描述
我正在进行单元测试,该测试运行的代码需要许多模拟对象才能完成它需要做的事情(测试HTML + PDF渲染) 。为了使这个测试成功,我需要生成许多模拟对象,并且每个对象最终都会将一些String数据返回给正在测试的代码。
I'm working on a unit test which exercises code that requires many mocked objects to do what it needs to do (testing HTML + PDF rendering). For this test to be successful I need many mocked objects to be generated and each of these objects ultimately return some String data to the code being tested.
我认为我可以通过实现我自己的 Answer
类或 IMockitoConfiguration
来实现这一点,但我不知道如何实现它们只会影响返回字符串的方法。
I think I can do this by implementing either my own Answer
class or IMockitoConfiguration
, but I am not sure how to implement those so they only affect methods which return Strings.
我觉得下面的代码接近我想要的。它抛出一个强制转换异常, java.lang.ClassCastException:java.lang.String无法强制转换为com.mypackage.ISOCountry
。我想这意味着我需要以某种方式默认或限制 Answer
只影响 String
的默认值。
I feel that the following code is close to what I want. It throws a cast exception, java.lang.ClassCastException: java.lang.String cannot be cast to com.mypackage.ISOCountry
. I think this means I need to somehow default or limit the Answer
to only affect the defaults for String
.
private Address createAddress(){
Address address = mock(Address.class, new StringAnswer() );
/* I want to replace repetitive calls like this, with a default string.
I just need these getters to return a String, not a specific string.
when(address.getLocality()).thenReturn("Louisville");
when(address.getStreet1()).thenReturn("1234 Fake Street Ln.");
when(address.getStreet2()).thenReturn("Suite 1337");
when(address.getRegion()).thenReturn("AK");
when(address.getPostal()).thenReturn("45069");
*/
ISOCountry isoCountry = mock(ISOCountry.class);
when(isoCountry.getIsocode()).thenReturn("US");
when(address.getCountry()).thenReturn(isoCountry);
return address;
}
//EDIT: This method returns an arbitrary string
private class StringAnswer implements Answer<Object> {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
String generatedString = "Generated String!";
if( invocation.getMethod().getReturnType().isInstance( generatedString )){
return generatedString;
}
else{
return Mockito.RETURNS_DEFAULTS.answer(invocation);
}
}
}
我如何设置Mockito默认情况下为返回String的模拟类上的方法返回生成的String? 我找到了关于此问题的这一部分的解决方案
How can I set up Mockito to return a generated String by default for methods on a mocked class which return String? I found a solution to this part of the question on SO
对于额外的积分,如何将生成的值设为一个字符串,其格式为 Class.methodName
?例如Address.getStreet1()
而不仅仅是一个随机字符串?
For extra points, how can I make that generated value be a String which is in the form Class.methodName
? For example "Address.getStreet1()"
instead of just a random String?
推荐答案
我能够完全回答我自己的问题。
I was able to completely answer my own question.
在这个例子中,生成了路易斯维尔地区的地址,而其他字段看起来像地址。 getStreet1();。
In this example an address with the Locality of Louisville is generated while the other fields look like "address.getStreet1();".
private Address createAddress(){
Address address = mock(Address.class, new StringAnswer() );
when(address.getLocality()).thenReturn("Louisville");
ISOCountry isoCountry = mock(ISOCountry.class);
when(isoCountry.getIsocode()).thenReturn("US");
when(address.getCountry()).thenReturn(isoCountry);
return address;
}
private class StringAnswer implements Answer<Object> {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
if( invocation.getMethod().getReturnType().equals(String.class)){
return invocation.toString();
}
else{
return Mockito.RETURNS_DEFAULTS.answer(invocation);
}
}
}
这篇关于如何在Mockito中更改字符串的默认返回值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!