Я гуглил по этому поводу, но не нашел ничего актуального. У меня есть что-то вроде этого:
Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);
Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();
Теперь я хочу убедиться, что то mymethod(Object o)
, что вызывается внутри runtestmethod()
, было вызвано с Объектом o
, а не с любым другим. Но я всегда сдаю тест, независимо от того, что я ставлю на проверку, например, с помощью:
Mockito.verify(mock.mymethod(Mockito.eq(obj)));
или
Mockito.verify(mock.mymethod(Mockito.eq(null)));
или
Mockito.verify(mock.mymethod(Mockito.eq("something_else")));
Я всегда сдаю тест. Как я могу выполнить эту проверку (если это возможно)?
Спасибо.
java
unit-testing
junit
mockito
manolowar
источник
источник
Вы пытаетесь сделать логическое равенство, используя метод объекта .equals? Вы можете сделать это, используя argThat matcher, который включен в Mockito
Затем вы можете реализовать свой собственный механизм сопоставления аргументов, который будет откладываться для каждого метода объектов .equals.
Теперь, используя свой код, вы можете обновить его, чтобы прочитать ...
Если вы просто хотите получить ТОЧНОЕ равенство (тот же объект в памяти), просто сделайте
Это подтвердит, что он был вызван один раз.
источник
ReflectionEquals
класс для этих целей.verify(mock).mymethod(obj);
не проверяет на точное равенство (тот же объект в памяти). Вместо этого он использует метод equals объекта, который мог бы быть переопределен.ArgumentMatcher
чтобы быть менее многословным.verify()
вызывается метод / входящего аргумента /equals()
, а не / записанный объект /equals()
метод. это не имеет значения, если вы не пытаетесь подтвердить, что ваш тестовый объект возвращает конкретный экземпляр объекта, а субъект возвращает вместо этого то, что должно быть прозрачным декоратором этого экземпляра. Вverify
аргументеequals()
не будет знать , декоратор; в то время как декораторыequals()
будут переписаны, чтобы терпеть оригинал. В этом случае ваш тест будет ошибочно провален.eq
совпадение, если вы не используете другие сопоставители..verify(mock)
. Теперь вы начинаете проверку результата вызова метода, ничего не проверяя (не вызывая метод). Следовательно, все тесты проходят.Ваш код должен выглядеть так:
источник
argThat
плюс лямбдавот как вы можете провалить проверку аргументов:
где
argThat
плюс утверждаетвышеупомянутый тест "скажет"
Expected: lambda$... Was: YourClass.toSting...
. Вы можете получить более конкретную причину сбоя, если использовать утверждения в лямбда-выражении:НО: ЭТО ТОЛЬКО РАБОТАЕТ С 1 МЕТОДОМ ВЫЗОВА. Если проверенный метод вызывается 2+ раза, mockito передает все вызываемые комбинации каждому верификатору. Таким образом, mockito ожидает, что ваш верификатор молча вернется
true
для одного набора аргументов иfalse
(без исключений assert) для других допустимых вызовов. Это ожидание не является проблемой для 1 вызова метода - оно должно просто возвращать true 1 раз.Теперь тест говорит:
Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. ПРИМЕЧАНИЕ. Я использовалassertJ
утверждения, но вам решать, какую платформу утверждений использовать.argThat
с несколькими аргументами.Если вы используете
argThat
, все аргументы должны быть снабжены совпадениями. Например:где:
eq
согласованисамый простой способ проверить, равен ли аргумент:
прямой аргумент
если сравнение по ссылке приемлемо, то продолжайте с:
Первопричина первоначального отказа вопроса была не в то место из paranthes:
verify(mock.mymethod...
. Это было неправильно. Право будет:verify(mock).*
источник
Я использовал Mockito.verify таким образом
источник
Вы проверили метод equals для надёжного класса? Если этот метод возвращает всегда значение true или вы проверяете один и тот же экземпляр на одном и том же экземпляре и метод равных не перезаписывается (и поэтому проверяет только ссылки), он возвращает значение true.
источник
Другой метод заключается в использовании метода org.mockito.internal.matchers.Equals.Equals вместо его переопределения:
источник
Вы пробовали это с тем же () совпадением? Как в:
У меня такая же проблема. Я пробовал это с помощью eq () matcher, а также refEq (), но у меня всегда были ложные срабатывания. Когда я использовал тот же () matcher, тест не удался, когда аргументы были разными экземплярами, и проходил, когда аргументы были одним и тем же экземпляром.
источник
Вы также можете использовать TypeSafeDiagnosingMatcher
Затем проверьте этот вызов:
источник