-1

静的クラスを呼び出すクラスがあります。静的クラスは基本的に別のクラスのラッパーです。静的クラスをモック/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を介してノードクラスをモックする方法をアドバイスしてください

4

2 に答える 2

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();
        }
    }

}

System.Web.HttpRequestこれは、 ASP.NETMVCプロジェクトがモック可能などのクラスを作成した方法と似ています

于 2012-09-18T16:50:19.313 に答える
2

短い答えはノーです!

クラスの具体的な実装をモックすることはできません。クラスのインスタンスのみを作成でき、インターフェイスまたは基本クラスのモックのみを作成できます。モックは、継承を使用してインターフェイスまたは基本クラスのプロパティを実装することにより、具象クラスのふりをします。基本的に、その場でクラスの新しい具象インスタンスを作成します。

構造を次のように変更した場合:

public class Node() : INode

次に、これをモックできます:

var moqNode = new Mock<INode>();

(これはmoq構文です)

次に、変数を型に変更する必要がありますINode

INode node = new Node(10);

そして、実際には依存関係を注入する必要もあります。

public static Node DoSomething(INode node)
        {

            return node;

        }

全体の茶番劇になるのは……?!

于 2012-09-18T16:41:20.273 に答える