2012-11-23 126 views
5

我有一个类(可以称之为A)是:如何对使用Web服务的类进行单元测试?

  • 在构造函数中需要配置,并在此基础上,创造了 Web服务的存根和存储在私人领域对它的引用。
  • 有几个方法可以调用web方法和其他东西。

我开始创建单元测试是:

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

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

  • 我应该嘲笑他们(在每个测试中,使用不同的数据)吗?
  • 或者我应该创建另一个只封装正在使用的Web方法的图层?
  • 或者还有另一种方法?
+1

谢谢!不知道这个功能! – Janek

回答

5

你应该围绕你的webservice创建一个包装接口,并让你的类受到依赖于该接口的依赖,而不是直接在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.... 

} 
+0

谢谢。所以你基本上提出了我列出的解决方案2号。但那么单元测试这个额外的层呢?我认为在某些时候,我将不得不嘲笑所有的方法,对吧?否则,我将不得不假设某些测试方法仅使用可用Web方法的固定子集 - 在单元测试时这不是一个适当的假设,这是否正确? – Janek

+0

选项2,是的。你不应该真的需要单元测试包装器接口或类,因为它所做的只是将对它的任何调用委托给第三方服务。所以单元测试这个类意味着单元测试Web服务,这不再是单元测试,而是一个集成测试。此外,使用“只有固定的可用网络方法子集”正是门面的要点 –

+0

感谢Greg。这就说得通了! – Janek

1

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

1

当你单元测试一个类时,你总是要确保只测试那个类并且不包含它的依赖关系。要做到这一点,你必须嘲笑你的WS,让它在调用方法时返回虚拟数据。根据你的场景,你不必为每个测试嘲笑所有的方法,我只会说那些被使用的方法。

关于嘲笑的例子,你可以阅读这篇文章:http://written-in-codes.blogspot.ca/2011/11/unit-tests-part-deux.html

相关问题