【问题标题】:How to mock method with variable parameters eg concatenate(String... messages)如何使用可变参数模拟方法,例如连接(字符串...消息)
【发布时间】:2017-05-23 11:44:33
【问题描述】:

如何用可变参数模拟方法concatenate(String... messages)

如果我将参数传递为

String[] messages = {"abc"};
Helper helper = mock(Helper.class);
doReturn(someStr).when(helper).concatenate(messages);

这行不通。

【问题讨论】:

  • 你为什么要首先做这样的事情?
  • @mike:我正在使用 mockito 编写 junit,我想模拟 concatenate()。我也试过 Mockito。anyVararg() 但没有运气。

标签: java mockito junit4


【解决方案1】:

老实说,我没有看到问题所在。让我们试试吧……

假设我们有这个类...

public class Helper {

    public String concatenate(String...strings) {
        // ...some concat logic, not important
    }

}

...现在我们要模拟它...

@Test
public void testSomething() {

    Helper helper = Mockito.mock(Helper.class);

    Mockito.doReturn("blablub").when(helper).concat(Mockito.anyVararg());

    Assertions.assertThat(helper.concat("bla", "bli")).isEqualTo("blablub");
}

是的,这行得通。我们给它“bla”和“bli”,但是因为我们告诉模拟在任何情况下都返回“blablub”,所以我们得到了结果。所以 mocking 任何 vararg 都很容易……我们当然也可以只检查整个 vararg 的一部分,例如……

    Mockito.doReturn("blablub").when(helper).concat(Mockito.anyString(), Mockito.eq("blub"), Mockito.anyVararg());

    Assertions.assertThat(helper.concat("bli", "blub", "bla", "blu", "blo")).isEqualTo("blablub");

...只要第二个参数是“blub”,它将返回“blablub”,无论其他参数是什么。

【讨论】:

    【解决方案2】:

    最好使用反射方法来初始化字符串值

    FieldUtils.writeField(testClass, "stringVariableName", "value", true);

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2022-01-19
      • 2014-03-15
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多