2016-11-24 14 views
1

Есть ли хороший способ использования power mockito для издевательства статического метода, показанного ниже в коде?Мощные модульные тесты для статических методов локального масштаба

@Singleton 
public class AnimalWorks { 

    public void verifyAnimal(Protocol proto, Set<Animal> successAnimals, Set<AnimalRule> rules, String zookeeper,OtherParams additionalParams) throws AnimalException, DAOException { 
     ... 

     // Static method call to fromAnimalId(arg1,arg2) below: 
     // How to mock this method call with PowerMockito so I can have a custom aniSet? 

     Set<Animal> aniSet = AnimalGenerator.fromAnimalId(dbtool, additionalParams); 

     ... 

    } 

} 

ответ

2

Mocking статические методы, использующие PowerMock объясняется here, например.

Но, пожалуйста, имейте в виду: когда вы говорите о своем собственном производственном коде, то это только второе лучшее решение! Потому что: статические звонок на самом деле дизайн проблема.

Да, статические методы удобны, но они также приводят к прямой/плотной связи вашего кода. И, конечно же, они ломают обычное единичное тестирование с помощью EasyMock или Mockito ...

Итак, альтернативный ответ: не используйте PowerMock. Вместо этого сделайте шаг назад и удалите статические зависимости от вашего кода. Например, создавая интерфейс, который обозначает требуемую функциональность; а затем вместо того, чтобы делать этот статический вызов внутри вашего кода, вы используете зависимую инъекцию для приобретения некоторого объекта, реализующего этот интерфейс.

И вдруг вам больше не нужен PowerMock.

Заключительное слово предупреждения: многие люди используют PowerMock без особых проблем. Но когда вы проводите некоторое исследование, вы также найдете множество людей, имеющих всевозможные странные проблемы с PowerMock. Таким образом, не просто выберите этот инструмент, потому что он кажется более удобным. Поймите, что совершенствует ваш дизайн полностью убивает необходимость использования этого инструмента!

EDIT:

Дело в том, вы не должны никогда делать вещи, потому что кто-то говорит, что «сделать это так». В идеале вы узнаете о плюсах и минусах различных подходов, а затем вы решаете, каким путем обратиться; в зависимости от этого анализа. Конечно, статический был доступен на Java с самого первого дня; таким образом, есть много людей, демонстрирующих хорошие варианты использования.

Но это не меняет недостатки, о которых я упомянул (прямая, плотная связь). Дело в том, что я полностью остановил с использованием статики - способами, которые препятствуют единичному тестированию. И я никогда не сожалел об этом.

И вы видите, есть люди, которые утверждают, что статического мешает вам от создания проверяемого кода - (! Смотреть эти видео стоят каждой минуты), как here. Не похоже, чтобы я придумал эту идею.

+0

Проблема заключается в том, что моделируется как статический заводский метод, как описано в эффективной java. https://books.google.com/books?id=ka2VUBqHiWkC&lpg=PA5&pg=PA5#v=onepage&q&f=false – user46743

+0

См. мой обновленный ответ. – GhostCat

+0

Согласовано. выбор статического метода для этого неинтересного класса - это решение времени разработки, которое сейчас сложно изменить. Обратившись к этой проблеме, я посмотрел на статью о дзоне, в то время как она затрагивает множество частей для решения этой головоломки. Мне все еще сложно провести работу над моим примером выше, и было бы очень полезно, если бы тестовый код для проблемы выше. – user46743

 Смежные вопросы

  • Нет связанных вопросов^_^