Mockito 2 теперь поддерживает конечные классы и методы!
Но пока это "инкубационная" функция. Для ее активации требуется выполнить несколько шагов, которые описаны в Что нового в Mockito 2:
Смоделирование конечных классов и методов - это инкубирующая возможность выбора. В нем используется комбинация инструментария Java agent и подклассов, чтобы обеспечить возможность макетирования этих типов. Поскольку это работает иначе, чем наш текущий механизм, и у этого есть другие ограничения, и поскольку мы хотим собрать опыт и отзывы пользователей, эту функцию пришлось явно активировать, чтобы она была доступна ; это можно сделать с помощью механизма расширения mockito, создав файл, src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker содержащий одну строку:
mock-maker-inline
После того, как вы создали этот файл, Mockito автоматически будет использовать этот новый движок, и можно будет сделать :
finalclassFinalClass { final String finalMethod() { return"something"; } }
На последующих этапах команда разработает программный способ использования этой функции. Мы определим и обеспечим поддержку для всех не поддающихся редактированию сценариев. Следите за обновлениями и, пожалуйста, сообщите нам, что вы думаете об этой функции!
это конфигурация, позволяющая заставить mockito работать с конечными классами
Если вы столкнулись с Could not initialize inline Byte Buddy mock maker. (This mock maker is not supported on Android.) Добавьте в свой файл зависимость Byte Buddybuild.gradle:
Вы не можете смоделировать конечный класс с помощью Mockito, так как вы не можете сделать это самостоятельно.
Что я делаю, так это создаю класс, не являющийся окончательным, чтобы обернуть конечный класс и использовать в качестве делегата. Примером этого является TwitterFactory class, и это мой класс-макет:
public Twitter getInstance() { return factory.getInstance(); } }
Недостатком является то, что существует много шаблонного кода; преимущество в том, что вы можете добавить некоторые методы, которые могут относиться к бизнесу вашего приложения (например, getInstance, который принимает пользователя вместо accessToken, в приведенном выше случае).
В вашем случае я бы создал не окончательный RainOnTrees класс, который делегирует конечному классу. Или, если вы можете сделать его не окончательным, это было бы лучше.