Используйте Answer
, чтобы проверить значение аргумента при вызове метода. Вы можете либо выбросить AssertionError
в Answer
, если значение неверно, либо вы можете сохранить значение, и выполнить свое утверждение в конце.
Вы не можете вызвать verify()
для объекта, который не является mock
. Это вы имели в виду?
Bar collaborator = mock(Bar.class);
Foo sut = spy(new Foo(collaborator));
verify(collaborator).run(expectedList);
Ответ 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.mutable
при последнем вызове bar.run(foo)
. Также возможно делать утверждения в блоке then {}
.
Почему бы вам не попробовать использовать захват аргументов, чтобы получить значение ожидаемого списка, когда он был запущен, и затем вы можете сравнить его.
ArgumentCaptor<List> listCaptor = ArgumentCaptor.forClass(List.class);
verify(collaborator).run(listCaptor.capture());
assertEquals(expectedList, argument.getValue());
expectedList
, а не копию, так что это по существу то же самое, что и он, не так ли?
– jhericks
31 January 2012 в 23:47
Answer
я используюArgurmentCaptor
и пишу одно или несколько утверждений о конечном состоянии этого списка, то есть с FEST-AssertassertThat(captor.getValue()).contains("A", "B").contains("T", "U");
– Brice 1 February 2012 в 15:33