Mockito可以在方法调用时根据它们的值validation参数吗?
我有一个Foo
class,是SUT和一个Bar
class,这是它的合作者。 Foo
调用在“ expectedList
”作为参数的Bar
上run(List values)
。 然后, Foo
将会添加更多的元素到这个List
这样它的状态将和调用run()
时的状态不同。 这是我的测试案例。
@Test public void testFoo() { Bar collaborator = spy(new Bar()); Foo sut = new Foo(collaborator); verify(collaborator).run(expectedList); }
请注意,协作者实际上是间谍对象而不是模拟对象。 这个测试用例将失败,因为即使run()
被调用的参数等于expectedList
,它也被修改了,因为它的当前值不再等于expectedList
。 然而,这是它应该工作的方式,所以我想知道是否有方法让Mockito在调用方法时存储参数的快照,并根据这些值而不是最近的值来validation它们。
在调用方法时使用“ Answer
来检查参数的值。 如果值是错误的,你可以在Answer
抛出一个AssertionError
,或者你可以存储这个值,并在最后做你的断言。
Dawood ibn Kareem的答案为我工作,但我缺乏一个例子,我也使用Kotlin和Mockito-Kotlin ,所以我的解决方案是这样的:
class Foo(var mutable: String) interface Bar { fun run(foo: Foo) } @Test fun `validate mutable parameter at invocation`() { val bar = mock() var valueAtInvocation: String? = null whenever(bar.run(any())).then { val foo = it.arguments.first() as Foo valueAtInvocation = foo.mutable // Store mutable value as it was at the invocation Unit // The answer } val foo = Foo(mutable = "first") bar.run(foo) valueAtInvocation isEqualTo "first" foo.mutable = "second" bar.run(foo) valueAtInvocation isEqualTo "second" }
valueAtInvocation
将表示最后一次调用bar.run(foo)
时的可变属性foo.mutable
的值。 应该也可以在then {}
块中做断言。
您不能在不是mock
的对象上调用verify()
。 这是你的意思吗?
Bar collaborator = mock(Bar.class); Foo sut = spy(new Foo(collaborator)); verify(collaborator).run(expectedList);
为什么不尝试使用参数捕获获取期望列表的值,当它运行,然后你可以比较它。
ArgumentCaptor listCaptor = ArgumentCaptor.forClass(List.class); verify(collaborator).run(listCaptor.capture()); assertEquals(expectedList, argument.getValue());
- 如何使用Lamba表达式使Java方法调用在Kotlin中不那么冗长?
- 构建器模式和大量的强制性参数
- 我现在正在用Kotlin开发一个Android应用程序,但是发生了一个错误:CompilationException:无法将方法调用“readText”内联到
- Kotlin / Java,字符串数组尚未在方法调用时初始化
- Lwjgl 3,如何获取当前线程中的OpenGL上下文?
- Jackson @JsonProperty注释用于kotlin数据类的使用
- Kotlin数据类型是由原始的还是非原始的Java数据类型构建的?
- 房间Kotlin:实体和Pojos必须有一个可用的公共构造函数
- 如何运行Google Map?