在单元测试中如何测试抽象类及其内部的受保护方法

5

如何测试抽象类及其中的受保护方法?我知道有些人会建议不要测试抽象类本身,而是测试从中派生的类。但问题在于,我不想这样做。我想严格测试抽象类本身。以下是示例类:

public interface IF_SystemMessageHandler
{
    ...
}

public interface IF_SystemMessageSender
{
    ...
}

    public abstract class Component : IF_SystemMessageSender
    {

        private eVtCompId mComponentId;
        private eLayer mLayerId;
        private IF_SystemMessageHandler mLogger;

        protected Component(eVtCompId inComponentId, eLayer inLayerId, IF_SystemMessageHandler inMessageHandler)
        {
            mLayerId = inLayerId;
            mComponentId = inComponentId;
            mLogger = inMessageHandler;
        }

        protected void SendSystemMessage(ref eSystemMsgLevel inSystemMsgLevel, ref string inSysMsg)
        {
            mLogger.SendSystemMessage(...);
        }

        protected void SendSystemMessage(ref eSystemMsgLevel inSystemMsgLevel, ref eTextId inSysMsgID)
        {
            mLogger.SendSystemMessage(...);
        }

        public void SetMessageHandler(ref IF_SystemMessageHandler InSystemMessageHandler)
        {
            mLogger = InSystemMessageHandler;
        }

    }

我正在为此编写单元测试。我知道其中一种方法是利用单元测试框架(我有Moq),但我不知道如何在这种特定情况下使用它。

2个回答

17
您需要使用一个可测试的类,该类继承自您要测试的类。例如,如果您有以下类:
public class ProtectedStuff
{
    protected bool MyProtectedMethod()
    {
        return true;
    }
}

然后在你的单元测试程序集中,像这样从你的类中继承:

public class TestableProtectedStuff : ProtectedStuff
{
    public new bool MyProtectedMethod()
    {
        return base.MyProtectedMethod();
    } 
}

这将为您提供一个与原始类完全相同的接口的类,但现在您可以访问受保护的方法。


2
代码棒极了。这个答案比@ulises的好多了。 - Isaac Llopis

5
为了测试抽象类,您需要实例化它。因此,创建一个从您的Component(抽象)类继承的用于测试目的的类。
除了使用的接口之外,我看不到需要模拟的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接