Проблема здесь в том, что когда вы создаете макет, этот объект не имеет поведения, если вы явно не имитируете его.Это включает в себя ваши equals
и hashCode
методы.
В вашем примере, одним из "исправлений" было бы использование методов equals
и hashCode
, но, очевидно, это не добавляет никакой ценности вашему тесту.Тривиально, вы можете инвертировать ваше утверждение (assertThat(a, is(c))
), которое работает, потому что конечный результат будет a.equals(c)
, а a
является реальным экземпляром класса A
вместо макета и имеет свойство .foo
mock.
Я подозреваю, что ваши примеры просто чрезмерно упрощены, но в этих конкретных случаях вы предпочитаете просто создавать реальный экземпляр вместо насмешки (например, val c = A("alpha")
, а не mock(A::class.java)
).
Некоторые другие подходы здесь могут быть:
Другой подход заключается в использовании шпиона, если вы можете получить реальный экземпляр класса.Например:
val c = spy(A("other value"))
doReturn("mock value").whenever(c).foo
Но в документации вы можете видеть, что эти способы частичной насмешки над классом не рекомендуются.