【问题标题】:Passing actual arguments in mockito stubbing在模拟存根中传递实际参数
【发布时间】:2016-03-14 06:28:15
【问题描述】:

对于在实际生产代码中生成存根变量的情况, 我们如何通过存根传递实际参数,例如在 JUnits 中使用 Mockito.when?

例如,如果生产代码中的方法是这样的:

1) servicaClass.doSomething(Calendar.getInstance)

2) servicaClass.doSomething(someMethodToCreateActualVariable())

在测试如何传递实际参数时? 喜欢

->when(mockedServiceClass.doSomething(Calendar.geInstance)).thenReturn("")

但是在测试生产代码时会在执行时采用自己的日历值。

有一种方法可以为使用的变量创建公共的 setter getter 方法。但这似乎不是最佳解决方案。

关于这方面的任何指示都会有所帮助吗?

【问题讨论】:

  • 不会简单地使用Mockito.any( Calendar.class ) 为您解决问题吗?如果您需要它更复杂,您可以使用 Answer 对象而不是简单的返回值来允许对各种输入参数做出更具体的反应...
  • 不想使用 any() 匹配器(想用实际参数测试)。我也看过Answer,但不确定它如何在实际代码中传递所需的参数进行测试。
  • 如果实际参数是即时创建的,例如Calendar.getInstance()Matchers 是您最好的机会。你可以试试Mockito.eq(...)。而Answer 只是获取一个InvocationMock 对象,您可以从中获取实际的参数对象。
  • 是的,仍然无法动态操作使用的参数。 Mockito.any() 只是帮助事业。 Answer 或 ArgumentCaptor 只能让我知道运行时使用了哪些参数。如果有的话需要检查一下吗?
  • 老实说,现在我不知道你想做什么以及为什么。请解释一下。

标签: mockito junit4 stubbing


【解决方案1】:

如果你知道匹配值事前,你可以使用存根。像 eq(与 equals 比较)和 same(与 == 比较)这样的 Mockito 匹配器将对此有所帮助,或者您可以通过直接指定值来获得 eq 行为。请注意,如果您使用任何值,则必须对所有值使用匹配器;您不能仅将 Matchers 用于双参数方法调用的一个参数。

// Without matchers
when(yourMock.method(objectToBeComparedWithEquals))
    .thenReturn(returnValue);

// With matchers
when(yourMock.method(eq(objectToBeComparedWithEquals)))
    .thenReturn(returnValue);
when(yourMock.method(same(objectToBeComparedReferentially)))
    .thenReturn(returnValue);

如果您直到运行该方法后才知道匹配值,您可能需要验证。相同的规则适用于 Matchers。

SomeValue someValue = yourSystemUnderTest.action();
verify(yourMock).initializeValue(someValue);

如果您需要事后检查该值,您可以使用 Captor:

ArgumentCaptor myCaptor = ArgumentCaptor.forClass(SomeValue.class);
yourSystemUnderTest.action();
verify(yourMock).initializeValue(myCaptor.capture());
SomeValue valueMockWasCalledWith = myCaptor.getValue();

// Now you've retrieved the reference out of the mock, so you can assert as usual.
assertEquals(42, valueMockWasCalledWith.getInteger());

【讨论】:

  • 是的,如果我知道动态创建了什么值(稍后断言)并使用它,这将起作用。但在 Calendar.getInstance 的情况下;我怎么能知道即时的价值是什么,要反对。 ArgumentCaptor 将记录使用的参数并告知我们。我想将我的值从测试传递给动态创建的参数。
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多