使用代码体中声明的具体类的单元测试类

问题描述

| 很简单,我想找出的是,是否有任何方法可以干净地对这段代码进行单元测试?我可以实例化它并运行一些断言,但我的意思是实际的单元测试,在该单元测试中,我将模拟服务对象以删除被测类的任何依赖关系,并实际上仅对其进行测试,而不是对其依赖的服务进行测试(在本例中为ConcreteService)。
public class Foo{

    public SomeResult DoSomething(){
        var service = new ConcreteService();
        var foo = service.Execute();
        return foo;
    }

}
我通常的方法是在代码主体中不要创建这种类型的对象,但是鉴于无法更改的情况,我对单元测试有哪些选择?     

解决方法

        考虑到约束(您不能修改/重新编译该代码),恐怕除了“集成测试”之外,您无能为力–真正的依赖关系,缓慢的测试。 实例化方法中的依赖关系,而不是将其接受为ctor或方法参数,会使事情变得困难。 正如伊森(Ethan)所说,那里有les鼠(但就我个人而言,这似乎并不正确)。我宁愿进行设计更改,也不愿使用能帮助我掩盖设计问题的框架。     ,        如果service.Execute()是虚拟的,则大多数模拟框架都支持此功能。我个人使用Rhino.Mocks。 请参阅此问题,该问题详细说明了在非接口上使用Mocking框架的功能,并讨论了模拟框架拦截虚拟调用的功能。 如果它不是虚拟的,并且您无法更改它,那么可以使用Moles。上面提到的帖子还提到了使用TypeMock的能力,我个人没有使用过。 在Microsoft研究站点上对Moles的描述:   Moles是一个轻量级框架,用于基于委托的.NET中的测试存根和弯路。可以使用Moles绕过任何.NET方法,包括密封类型的非虚拟/静态方法。     ,        我知道您提到过,这将是无法更改的情况的一个示例,但是我将努力重构该类,以便可以将ConcreteService作为依赖项注入。重构是解决不良设计的一种简单得多的方法。从您发布的内容来看,我认为没有理由您无法执行此操作。 编辑:FWIW,我同意@Gishu。如果您绝对不能修改该类,例如您不拥有它,也没有能力对其进行修改,那么集成测试是实现它的最佳方法。但是,如果您可以看到代码及其作用,那么我会支持我之前所说的,因为实际上没有理由不应该重构。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...