0

给定这个类:

public class MyClass 
{  
     private void MyMethod()  
     {  
         //...
     }  

     public void Execute()
     {  
        try
        {
             //...  
             MyMethod();  
             //... 
        }  
        catch(Exception e)  
        {  
            ...  
        }   
     }  
}

我如何模拟 MyMethod 来抛出一个OutOfmemoryException?

编辑1:

考虑到下一个MyMethod从数据库加载一些数据的情况,并且发生一些无法预料的错误,MyMethod将引发异常。我希望能够对这种情况进行单元测试。在我的例子中,来自 execute 方法的 catch 子句。

4

4 回答 4

6

我不使用最小起订量,所以有可能你可以通过某种方式做到这一点——但我认为,如果你需要,你做错了。

您通常应该模拟依赖项- 您不能依赖于您尝试测试的类中的私有成员,对吗?通常我会模拟一个接口——有时模拟一个类会很有用,但我通常不会。如果您正在调用某些依赖项,并且希望该调用的结果为OutOfMemoryException,则只需使该公共调用引发异常即可。

如果您觉得有充分的理由要模拟私有方法,请提供有关您的上下文的更多详细信息。

于 2012-01-13T14:36:32.143 回答
3

您只能模拟公共属性和公共方法(无论是在接口中还是直接在类中定义)。

于 2012-01-13T14:37:01.337 回答
-1

您遇到的基本上是原始 waqy Mock 用于模拟的限制。

有一些商业框架可以解决这个问题——Telerik 的 JustMock 是价格最合理的框架。他们通过将自己附加为分析器并替换执行的字节码来工作 - 所以他们真的模拟了这些方法。

MOCK——以及所有其他人都擅长的——基本上通过子类化/实现来工作,你不能子类化私有或非虚拟方法。这使得它们无法模拟任何不应被子类化的正确定义的密封对象 - 您必须将对象编程为打开,然后允许各种可能的滥用。

他们也不能模拟静态方法——少数人可以。这非常有用,因为它允许您例如模拟对 DateTime.UtcNow 的调用,因此它总是返回一个特定的时间,这可能在单元测试中需要。

所以,对不起,没有办法用 Mock 做到这一点。

于 2012-01-13T14:41:50.630 回答
-1

我没有机会尝试这个,但我们在我工作的一些地方使用 Moq,我也一直在努力解决这样的问题。首先,起订量本身并不是基于公共、私人等。它基于您的测试类的可见性。我们在 VB.net 上做了很多工作,所以我最近的记忆被它染上了颜色(即,对此持保留态度)。1)为了测试“私有”方法——尝试让您的测试程序集对包含您的被测类的程序集具有可见性。看这里有关如何执行此操作的信息。您需要将它们更改为“内部”(与 vb.net 中的朋友相同)。在经典的 TDD 中,您(通常)尝试让您的班级中的所有内容都对测试本身可见。2)一旦您了解了 MyMethod,您应该能够模拟出您需要的任何类型的异常的响应(假设您可以实例化并抛出它)。3)其他想法是在您的测试代码中创建一个内部类,该类扩展被测类并覆盖您想要从测试类内部控制的方法。

有时,特别是对于遗留代码,您必须做一些丑陋的事情来使代码可测试。

于 2012-01-13T16:15:17.957 回答