JustMock:模拟私有方法

时间:2016-11-02 13:05:08

标签: c# unit-testing mocking justmock

我是JustMock模拟框架的新手,我正在尝试模拟私有方法。我完全清楚单元测试私有方法是一种常见的错误做法,但在这种情况下,我别无选择。我一直在查看官方文档(http://www.telerik.com/help/justmock/advanced-usage-mocking-non-public-members-and-types.html),但似乎没有任何效果。

这是我的示例代码:

List<OverlayPresenter.EpgRowItem<?>> programs = ...;
OverlayPresenter.EpgRowItem<?> epgRowItem = programs.get(0);
String channelId = epgRowItem.value.first;  // OK

这是错误日志:

using System;
using Telerik.JustMock;

public class Program
{
    public class Foo
    {
        public void useA()
        {
            a();
        }

        private void a()
        {
            Console.WriteLine("AAAAAAAAAAAAAAA");
        }   
    }

    public static void Main()
    {
        var mockeClass = Mock.Create<Foo>(Behavior.CallOriginal);
        Mock.NonPublic.Arrange(mockeClass, "a").DoInstead(() => Console.WriteLine("Mock success!!!"));      

        mockeClass.useA();
    }
}

我很困惑,为什么它不起作用。

2 个答案:

答案 0 :(得分:0)

在我看来,有时候测试有助于让我们知道如何改进我们的代码,或者应该如何构建代码,就像Kritner所说的那样,函数可能是公开的而不是私有的。

另一方面,如果你想将它保持为私有,而不是测试对私有方法的调用,你可以在你的公共方法(私有方法被调用)中测试私有方法中的代码是在public方法中正确调用,如私有方法不存在,代码直接在public方法中写入。

编辑:您甚至可以创建一个调用私有方法的简单函数(并在可能的情况下添加与调用相关的逻辑)并测试此函数。

答案 1 :(得分:0)

我已尝试在干净的.NET 4.5控制台项目中运行您的代码并且按预期工作 - a()确实打印出模拟的值。 FileIOPermission是从JustMock获取的非常异常异常,可能是第一个到目前为止。对于控制台应用程序而言,权限错误通常更为罕见,因为它们通常完全信任。

如果您使用其调用堆栈将InnerException的{​​{1}}粘贴到故障单中,将会非常有用。只需从调试器中复制它。

相关问题