I want to mock CreateTopicAsync method. But because of the sealed nature of the class i am not able to mock the class. Any one Knows?
Asked
Active
Viewed 548 times
-1
-
1Possible duplicate of [How do you mock a Sealed class?](http://stackoverflow.com/questions/6484/how-do-you-mock-a-sealed-class) – Liam Nov 21 '16 at 14:37
-
But where is the Answer. I cannot make Microsoft to change implementation. :( – Ramankingdom Nov 21 '16 at 14:44
-
@Ramankingdom, Don't mock what you do not own. instead abstract it away and mock the abstraction. provide a [mcve] that reproduces your problem – Nkosi Nov 21 '16 at 14:50
1 Answers
3
You can't mock a sealed
class. Mocking relies on inheritence to build on the fly copies of the data. So trying to mock a sealed
class is impossible.
So what do I do?
What you can do is write a wrapper:
public class NamespaceManagerWrapper : INamespaceManagerWrapper
{
private NamespaceManager _instance;
public NamespaceManagerWrapper(NamespaceManager instance)
{
_instance = instance;
}
public ConsumerGroupDescription CreateConsumerGroup(ConsumerGroupDescription description)
{
return _instace.CreateConsumerGroup(description);
}
etc....
}
interface for the mock
public interface INamespaceManagerWrapper
{
ConsumerGroupDescription CreateConsumerGroup(ConsumerGroupDescription description);
....etc.
}
your method should now accept your wrapper interface on the original object:
public void myMethod(INamespaceManagerWrapper mockableObj)
{
...
mockableObj.CreateConsumerGroup(description);
...
}
Now you can mock the interface:
Mock<INamespaceManagerWrapper> namespaceManager = new Mock<INamespaceManagerWrapper>();
....etc.
myObj.myMethod(namespaceManager.Object);
Unfortunatly that's the best you can do. It's a siliar implementation to HttpContextWrapper