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



我有一个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 方法中模拟此方法,我的方法"母函数"?在我的示例中,"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时该怎么做,这可以通过带有语法的 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");
 ....
 }

并在你的母函数中调用它,如下所示:

public String motherFunction(){
  ....
  StringBuilder test = new StringBuilder();
  myClass2.functionVoid(test);
  if (test.toString().equals("")) {

现在修改上面的海洋生物的答案,您应该能够执行以下操作:

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(),你也可以让它返回一个字符串而不是 void。

在我的示例中,"test"变量仍然是空的。

这不是一个莫皮托问题。

看看这个问题,尤其是这个答案。

它的要点是Java是按值传递的(这在上面的链接中得到了更好的解释)。 在 Mockito 或 Java 中,除了空字符串之外,没有任何内容能够使 test var 成为任何其他内容。 它在方法调用之前是一个空字符串,在调用之后将是一个空字符串。

您可以在方法中更改

对象的状态(例如,将对象添加到方法中的集合中),并在退出方法时看到这些更改,但您无法更改 var 在方法中引用的对象,并期望这些更改在退出方法后"粘住"。 但是,字符串实际上是不可变的(没有要更改的状态),因此您甚至无法执行此操作。

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

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

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

Obj 必须是模拟或间谍。当您想检查是否将正确的参数传递给 void 方法时,这有效。

如果你的方法以某种方式修改了参数,那么你应该使用断言: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)

我不确定这是否是你要找的?

相关内容

  • 没有找到相关文章

最新更新