单元测试调用wcf服务的方法

问题描述

| 如何对调用WCF服务的业务层方法进行单元测试? 例:
public void SendData(DataUnit dataUnit)
{

        //this is WCF call
        SomeServiceClient svc = new SomeServiceClient();

        svc.SomeMethod(dataUnit);

}
有什么方法可以在单元测试项目中模拟SomeServiceClient?     

解决方法

这里的问题是您已将业务层与WCF服务紧密耦合-实际上在业务层中创建了服务客户端的新实例,这意味着现在不调用服务方法就无法调用SendData方法。 最好的解决方案是将依赖注入引入您的体系结构。 最简单的是,您要做的就是将服务类的实例传递到业务层。这通常是在类构造时使用构造函数参数完成的。
public class BusinessClass
{
    private ISomeServiceClient _svc;

    public BusinessClass(ISomeServiceClient svc)
    {
        _svc = svc;
    }

    public void SendData(DataUnit dataUnit)
    {
       _svc.SomeMethod(dataUnit);
    }
}
请注意,上面的代码是一种设计模式,绝对不依赖于任何框架(如控制容器倒置)。 如果您公司的政策是不使用此类框架(顺便说一句疯狂的政策),您仍然可以在单元测试中手动注入服务的模拟实例。     ,您应该将服务呼叫与业务层分开: 使用下面的演示,您列出的业务层方法现在看起来像这样:
public void SendData(IMyInterface myInterface,DataUnit dataUnit)
{

        myInterface.SomeMethod(dataUnit);

}
如果要执行服务调用,请传递RealThing;如果只想运行测试,请传递TestThing:
public interface IMyInterface
{
   void SomeMethod(DataUnit x);
}

public class RealThing : IMyInterface
{
   public void SomeMethod(DataUnit x)
   {
       SomeServiceClient svc = new SomeServiceClient();
       svc.SomeMethod(x);
   }
}

public class TestThing : IMyInterface
{
   public void SomeMethod(DataUnit x)
   {
       // do your test here
   }
}
    

相关问答

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