Сопоставления JMock с setAttribute(String, Object)
Я столкнулся с проблемой, ожидая вызова setAttribute от макета.
MyClass {
public final void setAttribute(String name, Object value) {
// Do Something
}
myClass.setAttribute("Key", "Value");
При вызове операции setAttribute String передается как значение. У меня есть макет вышеупомянутого класса по имени mockMyClass, и в моем блоке Ожидания у меня есть следующий код.
oneOf(mockMyClass).setAttribute(with(equal("Key")), with(equal("Value")));
Я также пытался использовать любой, просто чтобы увидеть, работает ли общий, но это также дает ту же проблему.
Исключение я получаю:
java.lang.IllegalArgumentException: не всем параметрам были заданы явные сопоставления: либо все параметры должны быть указаны сопоставителями, либо все должны быть указаны значениями, нельзя сопоставлять сопоставления и значения
Первоначально я пытался без каких-либо совпадений и получал исключение:
oneOf(mockMyClass).setAttribute("Key", "Value");
org.jmock.api.ExpectationError: неожиданный вызов
Как заставить это работать? Я намерен проверить фактические значения.
1 ответ
Сделать метод не окончательным
public void setAttribute(String name, Object value) {}
и использовать
oneOf(mockMyClass).setAttribute("Key", "Value");
или с matcher any();
из jmock - ClassImposteriser не может создавать макеты конечных классов или фиктивные финальные методы.
Пересечение классов с помощью jMock и ClassImposteriser Поскольку в нем используется стандартная возможность отражения Java, конфигурация по умолчанию в среде jMock может только макетировать интерфейсы, а не классы. (На самом деле, мы считаем, что это хорошая вещь, потому что это побуждает проект сосредоточиться на связи между объектами, а не на статической классификации или хранении данных). Однако класс расширения ClassImposteriser использует библиотеки CGLIB 2.1 и Objenesis для создания фиктивных объектов классов, а также интерфейсов. Это полезно при работе с устаревшим кодом, чтобы отделить зависимости между тесно связанными классами.
ClassImposteriser создает ложные экземпляры без вызова конструктора проверяемого класса. Таким образом, классы с конструкторами, которые имеют аргументы или вызывают overideable методы объекта, могут быть безопасно смоделированы. Однако ClassImposteriser не может создавать макеты конечных классов или фиктивные финальные методы.
Если вы хотите смоделировать финальные классы или финальные методы, библиотека JDave включает инструментальный инструмент нефинализатора, который может дефинализировать классы перед их загрузкой JVM. Затем они могут быть осмеяны ClassImposteriser.