Согласно Важное замечание о шпионаже реальных объектов! :
Mockito * не * делегирует вызовы переданному реальному экземпляру, вместо этого он фактически создает его копию. Поэтому, если вы сохраняете реальный экземпляр и взаимодействуете с ним, не ожидайте, что шпион узнает об этом взаимодействии и его влиянии на состояние реального экземпляра. [...]
Так что, в основном, он примет состояние вашего будущего в тот момент, когда вы позвоните spy()
. Если он уже завершен, то и получающийся шпион тоже будет. В противном случае ваш шпион останется незавершенным, кроме случаев, когда вы выполните его самостоятельно.
Поскольку асинхронное завершение будет выполняться в исходном будущем, а не в вашем шпионе, оно, таким образом, не будет отражено в вашем шпионе.
Единственный случай , где это будет работать должным образом, это когда у вас есть полный контроль над ним. Это означает, что вы создали бы CompletableFuture
с помощью new
, завернули его в шпиона и использовали бы только этого шпиона.
В целом, однако, я бы советовал избегать насмешливых фьючерсов , так как вы часто не контролируете, как они обрабатываются. И, как указано в Раздел Помните Мокито :
Не издевайтесь над типами, которых у вас нет
CompletableFuture
это не ваш тип.
В любом случае, не нужно издеваться над CompletableFuture
методами, так как вы можете контролировать то, что они делают, основываясь на complete()
или completeExecptionally()
. С другой стороны, нет необходимости проверять, вызваны ли его методы, так как:
- методы с побочными эффектами (например,
complete()
) могут быть легко утверждены впоследствии;
- другие методы возвращают значения, которые должны сделать ваш тест неудачным, если они не используются.
По сути, CompletableFuture
ведет себя подобно объекту значения, и в документации говорится:
Не имитировать значения объектов
Если вы чувствуете, что ваш тест не может быть написан без использования шпиона, попробуйте сократить его до MCVE и опубликовать отдельный вопрос о том, как это сделать.