使用mockito操纵参数的存根方法

Try*_*der 18 java methods unit-testing void mockito

我有以下情况:

class Worker {  
  public Integer somework() {  
      Integer k=0;  
      Helper h= new Helper();  
      h.change(k);  
      return k;  
    }
}

class Helper {
  public void change(Integer k) {
    //k = Some calcs
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在制作unitests Worker,显然我想要模拟Helper类,以便他的change方法总是将1放入k.

我的实际情况比较复杂,但这段代码代表了问题.感谢帮助.

omk*_*kar 18

我有一个定义如下的方法:

class Template{
   public void process(Object rootMap, StringWriter out){
 .......   
  }
 }
Run Code Online (Sandbox Code Playgroud)

我将向您展示如何更改/修改"out"(StringWriter)引用.

private final Template mocktTemplate = mock(Template.class);
doAnswer(new Answer<StringWriter>() {

            public StringWriter answer(InvocationOnMock invocation)
                    throws Throwable {
                Object[] args = invocation.getArguments();
                if (args[1] instanceof StringWriter) {
                    StringWriter stringWriter = (StringWriter) args[1];
                    stringWriter.write("Email message");
                }
                return null;
            }
        }).when(this.mocktTemplate).process(anyObject(),any(StringWriter.class));
Run Code Online (Sandbox Code Playgroud)

现在,当您确实进行实际调用时:

msgBodyTemplate.process(model, msgBodyWriter);
Run Code Online (Sandbox Code Playgroud)

msgBodyWriter中Stringbuffer ref的值为"Email message"; 不论它早期的价值.


Wil*_*hes 5

我认为 doAnswer 是处理 void 方法的最佳方法,该方法操作给定的参数。

doAnswer(new Answer() {
  public Object answer(InvocationOnMock invocation) {
      Object[] args = invocation.getArguments();
      Mock mock = invocation.getMock();
      return null;
  }})
.when(mock).someMethod();
Run Code Online (Sandbox Code Playgroud)

基本上,在获得参数后,您可以进行任何您想要的修改。有一篇博客文章对此进行了一些解释。


JB *_*zet 3

我会更改方法签名并使其Helper以实例作为参数。调用者将创建帮助程序并将其传递给该somework方法。该测试将通过模拟助手。

如果这是不可能的,至少调用受保护的工厂方法来创建帮助器,并在测试该方法时模拟此工厂方法,somework以使其返回模拟帮助器:

class Worker {  
    public Integer somework(){  
        Integer k=0;  
        Helper h= createHelper();  
        h.change(k);  
        return k;  
    }

    // this method may be mocked when testing somework, to return a mock helper.
    protected Helper createHelper() {
        return new Helper();
    }
}
Run Code Online (Sandbox Code Playgroud)