我如何改变默认返回值的字符串在Mockito



这篇2010年的文章暗示了我要做的事情。

我正在做一个单元测试,它需要许多模拟对象来做它需要做的事情(测试HTML + PDF渲染)。为了使这个测试成功,我需要生成许多模拟对象,并且每个对象最终都会返回一些String数据给被测试的代码。

认为我可以通过实现我自己的Answer类或IMockitoConfiguration来做到这一点,但我不确定如何实现这些,所以它们只影响返回字符串的方法。

我觉得下面的代码接近我想要的。它抛出一个强制转换异常java.lang.ClassCastException: java.lang.String cannot be cast to com.mypackage.ISOCountry。我认为这意味着我需要以某种方式默认或限制Answer仅影响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返回一个生成的字符串默认方法上的模拟类返回字符串?我在SO上找到了解决这部分问题的方法

对于额外的点,我怎么能使生成的值是一个字符串的形式Class.methodName ?例如"Address.getStreet1()",而不是只是一个随机字符串?

我完全能回答我自己的问题了。

在本例中,生成了一个带有Locality of Louisville的地址,而其他字段看起来像"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);
           }
       }
}

相关内容

  • 没有找到相关文章

最新更新