けさらんぱさらん

方向性は定めず、ただ思いつくままに

Moqでprotectedメソッドをモックする

通常は、テストしたいクラスが利用しているクラスのpublicメソッドをモックしますが
たまに自クラスのprotectedメソッドをモックしたい時があります。
(そりゃ設計が悪いって話もあるでしょうが、ここでは置いておきましょう)


こんなクラスがあります。

public class Hoge
{
    public bool Foo()
    {
        return Bar();
    }

    protected virtual bool Bar()
    {
       return true;
    }
}

Barメソッドをモックしてみます

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Moq.Protected;

namespace MoqSample
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<Hoge>();
            mock.Protected().Setup<bool>("Bar").Returns(false);

            Assert.IsFalse(mock.Object.Foo());
        }
    }
}


Moq.Protectedをusingしてください。
あとは、まあ見たままですかね
Setupメソッドの型引数なしバージョンだとReturnsが無いので注意