Это из-за того, как работают эти библиотеки.Когда вы макетируете класс с помощью Moq, NSubstitute или FakeItEasy, они динамически создают класс, который наследует этот класс и переопределяет его методы.Но они должны следовать правилам платформы для переопределения методов:
- не виртуальные методы не могут быть переопределены, по определению
- частные методы не доступны для производных классов, поэтому онине может быть переопределено (и на самом деле, C # даже не позволяет им быть виртуальными, поскольку это не имеет смысла)
- статические методы также не могут быть переопределены, потому что это не сделаетсмысл: полиморфизм основан на типе экземпляра, для которого вы вызываете метод, а статические методы не имеют экземпляра ...
На самом деле, эти библиотеки-насмешки не делают ничего, что вы не могли быне сделали себя вручную, написав поддельные / фиктивные классы;они просто облегчают задачу, освобождая вас от стандартного кода.Вы не можете вручную переопределить статический или не виртуальный метод, и эти библиотеки также не могут сделать это по той же причине.
Я не знаю, как работают JustMock и TypeMock Isolator;Я подозреваю, что они совершают какую-то темную магию с внутренними компонентами CLR или, возможно, динамически переписывают код (это то, что делает Pose : он заменяет вызовы указанных методов вызовами методов замены).
EDIT: См. этот вопрос о том, как работает TypeMock Isolator .Он использует API профилировщика для перехвата вызовов методов.Как я уже сказал, темная магия ^^