Это просто означает, что тип данных определяется в модуле, который определяется с помощью безопасного расширения. Вы можете найти детали расширения в руководстве пользователя .
Фактически вы можете проверить это самостоятельно, указав модуль с расширением Safe
:
{-#LANGUAGE Safe#-}
data Test = Test deriving (Eq, Show)
И затем попробуйте его в ghci
:
λ> :i Test
data Test = Test
instance [safe] Eq Test
instance [safe] Show Test
Но обратите внимание, что в текущем GHC (7.10.2) безопасное расширение не может быть связано с гарантией доверия, потому что из этой ошибки ghc .
Когда у меня есть класс, который нельзя легко дразнить, потому что это является окончательным (или впаянный C#), мой обычный маршрут должен записать обертку вокруг класса и использовать обертку везде, где я использовал бы фактический класс. Затем я дразнил бы класс обертки по мере необходимости.
Я использовал URLHandler, который позволяет мне загружать URL из пути к классу. Таким образом, следующий
new URL("resource:///foo").openStream()
открыл бы файл, названный нечто из пути к классу. Чтобы сделать это, я пользуюсь общая служебная библиотека и регистрирую обработчик. Для использования этого обработчика просто необходимо звонить:
com.healthmarketscience.common.util.resource.Handler.init();
и URL ресурса теперь доступно.
Я посмотрел бы снова на то, почему Вы хотите дразнить заключительный объект данных. Так как по определению Вы не разделяете объект на подклассы в своем фактическом коде, и это не будет объектом под тестом, Вы не должны должны быть к белому полю тестировать этот код; просто передача в любых (реальных) объектах URL является соответствующей, и проверяет вывод.
Фиктивные объекты полезны, когда трудно создать реальный соответствующий объект, или метод реального объекта являются или трудоемкими или зависят от некоторого внешнего ресурса с сохранением информации (как база данных). Ни один из них не применяется в этом случае, таким образом, я не вижу, почему Вы не можете только создать реальный объект URL представление соответствующего местоположения ресурса.
Класс URL реализует интерфейс? Раз так затем Вы могли инстанцировать его с помощью инверсии управления или настраиваемой фабрики, а не прямой конструкцией, это позволит Вам вводить/создавать тестовый экземпляр в тестовом времени выполнения, а не заключительный экземпляр, который Вы в настоящее время имеете.
JMockit действительно позволяет имитировать последний класс JRE, такой как java.net.URL.
Кажется, что Attach API в jdkDir / lib / tools.jar доступен в реализациях JDK 1.6 кроме Sun тоже не работает. Я полагаю, что этот материал все еще слишком новый / продвинутый или просто не получил должного внимания со стороны других поставщиков JDK (Apple, IBM с J9 JDK, Oracle с JRockit JDK).
Итак, если вы столкнетесь с проблемы из-за наличия tools.jar в пути к классам, попробуйте использовать аргумент JVM "-javaagent: jmockit.jar". Он сообщает JVM напрямую загружать java-агент при запуске без использования Attach API. Это должно работать в Apple JDK 1.5 / 1.6.