我有一个带有受保护方法的密封类,我想测试它的行为。这使得很难直接测试,很难模拟。
它位于不是以TDD方式开发的代码库中,我现在正在为特定功能添加单元测试。
在这种情况下,可能的一般方法是什么?目前我有:
还有吗?
答案 0 :(得分:7)
密封类中的protected
方法实际上与private
相同(我猜如果你密封了基类有protected
成员的派生类,这些可以自然地出现。)
测试private
方法毫无意义。因为除了可以通过定义类的public
方法访问的行为之外,它们没有public
行为,所以应该通过测试public
方法来测试它们的行为。
答案 1 :(得分:3)
Microsoft Moles有助于使用非虚方法模拟未密封的类。它不能模拟私有方法,但这是多余的,因为你可以模拟更高级别的公共方法,使用外部特定类,你可以模拟一个模拟一个公共方法的所有必要行为。
为什么要测试私有/受保护的方法?您可以使用内部方法和InternalVisibleToAttribute来实现此目的。但一般来说,您应该只测试公共行为(即只测试公共接口)。
答案 2 :(得分:2)
我通常会选择第二种选择,假设您能够轻松地进行更改。鉴于如果你无法通过它的公共接口测试受保护/私有方法正在做什么,它可能不符合单一责任原则,并且代码可能会被分成两个类并使用组合代替。
答案 3 :(得分:1)
你可以使用一些框架进行模拟 - 例如JustMock(通过Telerik)支持模拟密封的私有方法......不幸的是,JustMock的这部分付费,我认为,但至少你可以尝试试用版。
答案 4 :(得分:1)
您可以使用JustMock框架。 例如:
double value = 0;
var fakeFilterSetHelper = Mock.Create<FilterSetHelper>(Behavior.CallOriginal);
Mock.NonPublic.Arrange<double>(fakeFilterSetHelper, memberName: "GetPriceRangeFromSession").Returns(value);