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

2022-09-02 01:19:59

我有以下情况:

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
  }
}

我正在为它做单位,显然我想模拟类,以便他的方法总是将1放入。WorkerHelperchangek

我的实际情况更复杂,但这段代码代表了问题。感谢您的帮助。


答案 1

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

class Template{
   public void process(Object rootMap, StringWriter out){
 .......   
  }
 }

我将向您展示如何更改/修改“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));

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

msgBodyTemplate.process(model, msgBodyWriter);

msgBodyWriter中Stringbuffer ref的值将是“电子邮件消息”;不管它的早期价值如何。


答案 2

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

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

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