我正在编写模拟单元测试代码,该代码将测试将输入参数接口向下转换为具体类的类方法。
这是名为 CarWrapperFactory 的“被测系统 (SUT)”类:
public class CarWrapperFactory : ICarWrapperFactory { public ICarWrapper CreateCarWrapper(ICarConfigurationWrapper carConfigurationWrapper) { // downcasting occurring on next line, and also subsequently invocation of "protected internal" method CarConfiguration loggerConfiguration = ((CarConfigurationWrapper)carConfigurationWrapper).GetCarConfigurationAdaptee(); return new CarWrapper(carConfiguration.CreateCar()); } }
在前面提到的 CarWrapperFactory SUT 类中,存在向下转换代码,因为它调用名为 GetCarConfigurationAdaptee 的“受保护内部”方法。
在我的基于 NSubstitute 的模拟单元测试代码中,我从以下内容开始:
ICarConfigurationWrapper carConfigurationWrapperMock = Substitute.For<ICarConfigurationWrapper>(); // Fill-in-blank code….how to mock the “protected internal” method called GetCarConfigurationAdaptee ICarWrapperFactory carWrapperFactorySUT = new CarWrapperFactory(); ICarWrapper carWrapper = carWrapperFactorySUT. CreateCarWrapper(carConfigurationWrapperMock);
有人可以提供上面“填空”代码的代码吗?
首先 ICarConfigurationWrapper 应该包含所有方法作为类的契约
调用受保护的方法是糟糕的代码设计,将它们视为私有方法,因此您需要在界面中将此受保护的方法拉起。并且您不需要进行任何转换,并且在单元测试中您可以轻松地用模拟实现替代