Mockito可以根据方法调用时的值验证参数吗



我有一个Foo类是SUT,还有一个Bar类是它的合作者。Foo使用"expectedList"作为参数在Bar上调用run(List<Object> 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在调用方法时存储参数的快照,并根据这些值而不是最新的值来验证它们。

调用方法时,使用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<Bar>()
    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"
}

CCD_ 16将表示在CCD_ 18的最后一次调用时可变属性CCD_。还应该可以在then {}块中进行断言。

不能在非mock的对象上调用verify()。这就是你的意思吗?

Bar collaborator = mock(Bar.class); 
Foo sut = spy(new Foo(collaborator));
verify(collaborator).run(expectedList);

为什么不在运行时尝试使用参数捕获来获取预期列表的值,然后进行比较。

ArgumentCaptor<List> listCaptor = ArgumentCaptor.forClass(List.class);
verify(collaborator).run(listCaptor.capture());
assertEquals(expectedList, argument.getValue());

相关内容

  • 没有找到相关文章

最新更新