Mockito能否在调用方法时根据参数的值来验证参数?

2022-09-02 10:47:05

我有一个类是SUT和一个类,它是它的合作者。 调用带有 “” 作为参数。然后,将向其中添加更多元素,以便其状态将与调用时的状态不同。这是我的测试用例。FooBarFoorun(List<Object> values)BarexpectedListFooListrun()

@Test
public void testFoo() {
    Bar collaborator = spy(new Bar()); 
    Foo sut = new Foo(collaborator);
    verify(collaborator).run(expectedList);
}

请注意,协作者实际上是间谍对象,而不是模拟对象。这个测试用例将失败,因为即使调用的参数等于 ,它也被修改了,因为它的当前值不再等于 。但是,这是它应该工作的方式,所以我想知道是否有一种方法可以让Mockito在调用方法时存储参数的快照,并根据这些值而不是最新的值来验证它们。run()expectedListexpectedList


答案 1

使用 在调用方法时检查参数的值。如果值错误,则可以在 内抛出一个,也可以存储该值,并在最后执行断言。AnswerAssertionErrorAnswer


答案 2

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"
}

valueAtInvocation将表示上次调用 时可变属性的值。也应该可以在块内做断言。foo.mutablebar.run(foo)then {}


推荐