如何在静态类中模拟/ ioc类?

时间:2012-09-18 16:34:00

标签: c# inversion-of-control castle-windsor moq rhino-mocks

我有一个调用静态类的类,静态类基本上是另一个类的包装器。我知道我不能模拟/ ioc静态类,但可以为非静态类做这个吗?

下面的

是我的代码结构的示例

namespace lib.CanModify
{
    public class Something
    {
        public void method()
        {
            var obj = lib.CanNotModify.StaticClass.DoSomething();


        }
    }

}
namespace lib.CanNotModify
{
    public static class StaticClass
    {
        public static Node DoSomething()
        {
            /*The class i want to mock!*/
            Node node = new Node(10);
            return node;

        }
    }
}

请建议通过mstest

模拟节点类的方法

2 个答案:

答案 0 :(得分:2)

简短的回答是否定的!

您无法模拟类的具体实现。您只能创建类的实例,您只能模拟接口或基类。模拟通过使用继承实现接口或基类的属性来伪装成具体类。基本上是在运行中创建一个新的具体实例。

如果您将结构更改为:

public class Node() : INode

然后你可以嘲笑这个:

var moqNode = new Mock<INode>();

(这是moq语法btw)

然后,您需要将变量更改为键入INode

INode node = new Node(10);

然后你实际上还需要注入你的依赖性:

public static Node DoSomething(INode node)
        {

            return node;

        }

这将成为整个事情的闹剧......?!

答案 1 :(得分:2)

您可以创建StaticClassWrapper和界面IStaticClass,然后将IStaticClass注入您的方法。

然后您可以轻松模拟IStaticClass

namespace lib.CanModify
{
    using lib.CanNotModify;

    public class Something
    {
        public void method()
        {
            method(new StaticClassWrapper());
        }

        public void method(IStaticClass staticClass)
        {
            var obj = staticClass.DoSomething();
        }
    }

    public interface IStaticClass
    {
        Node DoSomething();
    }

    public class StaticClassWrapper : IStaticClass
    {
        public Node DoSomething()
        {
            return lib.CanNotModify.StaticClass.DoSomething();
        }
    }

}

这类似于ASP.NET MVC项目如System.Web.HttpRequest mockable

这样的类