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

2022-09-04 06:22:23

我有一个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();     

 }
}

答案 1

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

    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());

答案 2

如果您可以更改 functionVoid() 以接受可变对象作为参数,那么您应该能够实现所需的目标。

例如,如果按如下方式更改函数 Void():

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

 ....
 }

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

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。


推荐