我有一个类(可以称之为A)是:如何对使用Web服务的类进行单元测试?
- 在构造函数中需要配置,并在此基础上,创造了 Web服务的存根和存储在私人领域对它的引用。
- 有几个方法可以调用web方法和其他东西。
我开始创建单元测试是:
- 创建类A的一个虚设的配置的实例。
- 通过反射,它注入了模拟的Web服务存根。
虽然该Web服务有很多方法。
- 我应该嘲笑他们(在每个测试中,使用不同的数据)吗?
- 或者我应该创建另一个只封装正在使用的Web方法的图层?
- 或者还有另一种方法?
我有一个类(可以称之为A)是:如何对使用Web服务的类进行单元测试?
我开始创建单元测试是:
虽然该Web服务有很多方法。
你应该围绕你的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....
}
简短回答是的:)。长答案你应该使用某种模拟库,例如:http://code.google.com/p/mockito/,并在你的单元测试模拟WS存根,并将其传递给被测试的类。这是力量的方式:)
当你单元测试一个类时,你总是要确保只测试那个类并且不包含它的依赖关系。要做到这一点,你必须嘲笑你的WS,让它在调用方法时返回虚拟数据。根据你的场景,你不必为每个测试嘲笑所有的方法,我只会说那些被使用的方法。
关于嘲笑的例子,你可以阅读这篇文章:http://written-in-codes.blogspot.ca/2011/11/unit-tests-part-deux.html
谢谢!不知道这个功能! – Janek