对于在实际生产代码中生成的存根变量的情况, 我们如何在JUnits中使用Mockito.when传递实际参数?
例如,生产代码中的方法如下:
1)servicaClass.doSomething(Calendar.getInstance)
2)servicaClass.doSomething(someMethodToCreateActualVariable())
在测试实际参数如何传递时? 喜欢
- > when(mockedServiceClass.doSomething(Calendar.geInstance)).thenReturn("")
但是,测试生产代码时会在执行时采用自己的日历值。
可以有一种方法可以为使用过的变量填充公共setter getter方法。但这似乎不是最佳解决方案。
这方面的任何指示都会有所帮助吗?
答案 0 :(得分:1)
如果您在事实之前知道匹配值,则可以使用存根。像eq
(与equals
比较)和same
(与==
比较)等Mockito匹配器会对此有所帮助,或者您可以通过指定eq
行为来获得// 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;你不能只使用Matchers进行双参数方法调用的一个参数。
SomeValue someValue = yourSystemUnderTest.action();
verify(yourMock).initializeValue(someValue);
如果您在运行方法之后不知道匹配值,则可能需要验证。相同的规则适用于Matchers。
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());
如果您需要在事后检查该值,您可以使用Captor:
finally: