5

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

  • 在构造函数中,接受一个配置并基于它,创建一个 Web 服务的存根,并将对它的引用存储在一个私有字段中。
  • 有一些调用 web 方法的方法和一些介于两者之间的东西。

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

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

尽管该 Web 服务有很多方法。

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

3 回答 3

5

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

在不知道你正在测试什么的情况下,瞄准这样的目标:

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....

}
于 2012-11-23T19:58:53.040 回答
1

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

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

于 2012-11-23T20:52:42.927 回答
1

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

于 2012-11-23T18:40:11.050 回答