繁体   English   中英

Mockito如何使用输出参数模拟void方法?

[英]Mockito How to mock void method with output argument?

我有一个void方法“functionVoid”通知参数。

public class MyMotherClass {
 @Inject
 MyClass2 myClass2

 public String motherFunction(){
  ....
  String test = "";
  myClass2.functionVoid(test);

  if (test.equals("")) {
      IllegalArgumentException ile = new IllegalArgumentException(
      "Argument is not valid");
      logger.throwing(ile);
      throw ile;
  }
  ....
 }
}

public class MyClass2 {

public void functionVoid(String output_value)
{ ....
 output_value = "test";

 ....
 }
}

如何在JUnit方法中模拟我的方法“motherFunction”? 在我的例子中,“test”变量仍然是空的。

@RunWith(MockitoJUnitRunner.class)
public class MyMotherClassTest {

 @Mock
 private MyClass2 myClass2 ;

 @InjectMock
 private final MyMotherClass myMotherClass = new MyMotherClass ();

 @Test
 public void test(){

  myMotherClass.motherFunction();     

 }
}

如果你想模拟motherFunction的返回结果,那么你不必担心方法的内部实现(最终调用functionVoid )。 你需要做的是向Mockito提供一个指令, motherFunction在调用方法motherFunction时该怎么做,这可以通过带语法的when子句来实现;

    when(mockedObject.motherFunction()).thenReturn("Any old string");

如果这忽略了你试图实现的目的,那么看看如何模拟文档中的void方法 ,并确定doAnswer的使用是否适用于此,类似于;

doAnswer(new Answer<Void>() {

  @Override
  public Void answer(InvocationOnMock invocation) throws Throwable {
    String output_value = invocation.getArguments()[0];
    output_value = "Not blank";
    return null;
  }
}).when(myClass2).functionVoid(anyString());

如果你可以改变functionVoid()来接受一个可变对象作为参数,那么你应该能够实现你想要的。

例如,如果您更改functionVoid(),如下所示:

public void functionVoid(StringBuilder output_value)
{ ....
 output_value.append("test");

 ....
 }

并在您的motherFunction中调用它,如下所示:

public String motherFunction(){
  ....
  StringBuilder test = new StringBuilder();
  myClass2.functionVoid(test);

  if (test.toString().equals("")) {

现在修改OceanLife上面的答案,你应该能够做到以下几点:

doAnswer(new Answer<Void>() {

  @Override
  public Void answer(InvocationOnMock invocation) throws Throwable {
    StringBuilder output_value = invocation.getArguments()[0];
    output_value.append("Not blank");
    return null;
  }
}).when(myClass2).functionVoid(any(StringBuilder.class)); 

当然,如果你可以改变functionVoid(),你也可以让它返回一个String而不是void。

在我的例子中,“test”变量仍然是空的。

这不是Mockito问题。

看看这个问题 ,特别是这个答案

它的要点是Java是按值传递的(这在上面的链接中解释得更好)。 Mockito或Java中的任何内容都无法使test变量除了空字符串之外的任何内容。 它在方法调用之前是一个空字符串,在调用之后将是一个空字符串。

您可以在方法中更改对象的状态(例如,将对象添加到方法中的集合中)并在退出方法时查看这些更改,但是您无法更改var在方法中引用的对象并期望这些更改“粘贴”退出方法后。 然而,字符串实际上是不可变的(没有状态可以改变),所以你甚至不能这样做。

因此,在该方法调用中不能对test进行任何修改。

如果要检查对象Obj的方法someMethod(String arg),那么:

String argument = "";
Mockito.verify(Obj, Mockito.times(1)).someMethod(argument);

Obj必须是Mock或Spy。 当您想要检查是否将适当的参数传递给void方法时,这种方法有效。

如果你的方法修改了某种方式,那么你应该使用assertion:someMethod(StringWrapper wrapper)来改变字符串。

// given
String argument = "a";
String expected = "a_changed";
String wrapped = new StringWrapper(a);

// when
someMethod(wrapped);

// then
Assert.assertEquals(wrapped.getString(), expected)

我不确定你是否在寻找这个?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM