Почему Mockito не издевается над статическими методами?



Я прочитал несколько потоков здесь о статических методах, и я думаю, что понимаю проблемы, которые могут вызвать неправильное/чрезмерное использование статических методов. Но я действительно не понял, почему трудно издеваться над статическими методами.



Я знаю, что другие насмешливые фреймворки, такие как PowerMock, могут это сделать, но почему не могут Mockito?



я прочитала в этой статье, но автор, кажется, религиозно против слова static, может быть, это мой бедный понимание.



простое объяснение/ссылка было бы здорово.

579   5  

5 ответов:

Я думаю, что причина может быть в том, что библиотеки макетов объектов обычно создают насмешки, динамически создавая классы во время выполнения (используя cglib). Это означает, что они либо реализуют интерфейс во время выполнения (это то, что делает EasyMock, если я не ошибаюсь), либо они наследуют от класса mock (это то, что делает Mockito, если я не ошибаюсь). Оба подхода не работают для статических членов, так как вы не можете переопределить их с помощью наследования.

единственный способ издеваться над статикой-это к изменить байтовый код класса во время выполнения, который, я полагаю, немного более вовлечен, чем наследование.

Это моя догадка, для чего это стоит...

Если вам нужно издеваться над статическим методом, это сильный показатель плохой дизайн. Обычно вы издеваетесь над зависимостью вашего тестируемого класса. Если ваш тестируемый класс ссылается на статический метод, подобный java.утиль.Например, Math#sin-это означает, что тестируемый класс нуждается именно в этой реализации (например, точности и скорости). Если вы хотите абстрагироваться от конкретной реализации синуса, вам, вероятно, нужен интерфейс (вы видите, где это происходит)?

Я серьезно думаю, что это запах кода, если вам тоже нужно издеваться над статическими методами.

  • статические методы для доступа к общей функциональности? - >Используйте одноэлементный экземпляр и введите это
  • сторонний код? - >Оберните его в свой собственный интерфейс / делегат (и при необходимости сделайте его синглтоном)

единственный раз, когда это кажется мне излишним, это libs, как гуава, но вам не нужно издеваться над этим видом в любом случае, потому что это часть логики... (такие вещи, как Iterables.трансформировать.(.))
Таким образом, ваш собственный код остается чистым, вы можете издеваться над всеми своими зависимостями чистым способом, и у вас есть антикоррупционный слой против внешних зависимостей. Я видел PowerMock на практике, и все классы, в которых мы нуждались, были плохо спроектированы. Также интеграция PowerMock порой вызывала серьезные проблемы
(например https://code.google.com/p/powermock/issues/detail?id=355)

PS: то же самое относится и к частным и методы тоже. Я не думаю, что тесты должны знать о деталях частных методов. Если класс настолько сложен, что он соблазняется издеваться над частными методами, это, вероятно, признак разделения этого класса...

Mockito возвращает объекты, но статический означает "уровень класса, а не уровень объекта", поэтому mockito даст исключение нулевого указателя для статического.

в некоторых случаях статические методы могут быть трудно проверить, особенно если они должны быть высмеяны, поэтому большинство насмешливых фреймворков не поддерживают их. Я нашел этой сообщение в блоге, чтобы быть очень полезным в определении того, как издеваться над статические методы и классы.

Comments

    Ничего не найдено.