如何对使用Web服务的类进行单元测试?

时间:2012-11-23 18:35:40

标签: web-services unit-testing mocking

我有一个类(我们称之为A):

  • 在构造函数中获取配置并基于它,创建一个存根 Web服务并在私有字段中存储对它的引用。
  • 有一些方法可以调用Web方法和中间的一些东西。

我开始创建一个单元测试:

  • 使用虚拟配置创建A类实例。
  • 通过反射,它会注入模拟的Web服务存根。

虽然该Web服务有很多方法。

  • 我应该全部模仿它们(在每次测试中,使用不同的数据)吗?
  • 或者我应该创建另一个只封装正在使用的Web方法的层?
  • 还是有另一种方法?

3 个答案:

答案 0 :(得分:5)

您应该在Web服务周围创建一个包装器接口,并使您的测试类依赖于该接口,而不是直接在Web服务上;然后你可以模拟界面。只有让该接口公开您感兴趣的Web服务的方法。这被称为外观模式,详细here

如果不了解您正在测试的内容,请针对以下内容:

public interface IWebserviceWrapper
{
    Whatever DoStuff(int something);
}

public class WebserviceWrapper : IWebserviceWrapper
{
    private WebService _theActualWebservice;

    public WebserviceWrapper(Webservice theService)
    {
        _theActualWebService = theService;
    }

    public Whatever DoStuff(int something)
    {
         return _theActualWebservice.DoSomething(something);
    }

}

然后你的测试看起来像这样(在这种情况下,使用MOQ)

public void Test_doing_something()
{
    Mock<IWebserviceWrapper> _serviceWrapperMock = new Mock<IWebserviceWrapper>();

    _serviceWrapperMock.SetUp(m => m.DoStuff(12345)).Returns(new Whatever());

    var classUnderTest = new ClassUnderTest(_serviceWrapperMock.Object);

    var result = classUnderTest.Dothings(12345);

    Assert.Whatever....

}

答案 1 :(得分:1)

简短回答是:)。很长的答案你应该使用某种模拟lib,例如:http://code.google.com/p/mockito/并在你的单元测试中模拟WS存根并将其传递给测试类。这就是力量的方式:)

答案 2 :(得分:1)

当你对一个类进行单元测试时,你总是希望确保只测试该类而不包括它的依赖项。要做到这一点,你必须模拟你的WS,让它在调用方法时返回虚拟数据。根据您的情况,您不必为每个测试模拟所有方法,我只会说那些使用的方法。

有关模拟的示例,您可以阅读以下文章:http://written-in-codes.blogspot.ca/2011/11/unit-tests-part-deux.html