如何对抽象类进行单元测试

Posted

技术标签:

【中文标题】如何对抽象类进行单元测试【英文标题】:How to unit test abstract classes 【发布时间】:2011-12-19 11:14:07 【问题描述】:

在 Visual Studio 中使用了创建单元测试工具,显然它试图实例化我的抽象类。

我的问题是:我应该尝试对 Visual Studio 试图让我这样做的方式进行单元测试,还是应该创建一个要实例化的模拟类,还是应该只测试使用这个抽象类的方法?

谢谢。

【问题讨论】:

【参考方案1】:

如果这个抽象类上有值得测试的方法,那么你应该测试它们。您始终可以将测试的抽象类子类化(并将其命名为 MyAbstractClassTesting)并测试这个新的具体类。

【讨论】:

【参考方案2】:

有两种相反的观点:

不要测试抽象类本身,测试继承自它的具体类 抽象类也应该进行测试,因为它提供了一些在所有继承类之间共享的内置逻辑,因此您只需在抽象类中测试一次基本逻辑

我更喜欢第二个选项(目前)并使用RhinoMocks PartialMock 功能测试抽象类,它允许我创建抽象类的模拟。

【讨论】:

【参考方案3】:

    只需测试实现类。

    您始终可以创建一个特定的测试实现,而不会添加额外的功能。

    收听测试。使用具有魔力的模拟工具来测试抽象类和私有方法等是一种测试代码味道

【讨论】:

【参考方案4】:

从模拟存储库中使用:

[testmethod]
       public void testwithmockrepository()
       
           var mockrepository = new rhino.mocks.mockrepository();
           var mock = mockrepository.partialmock<myabstractclass>();

           using ( mockrepository.record() )
           
               expect.call( mock.dosomething( arg<string>.is.anything ) ).return( "hi..." ).repeat.once();
           
           using ( mockrepository.playback() )
           
               assert.areequal( "hi..." , mock.dosomething( "salam" ) );
           
       

【讨论】:

【参考方案5】:

我不会测试抽象类,原因很简单:实现类可能有自己的某些方法的实现——如果你测试抽象类,你不会知道进一步的代码实际上是如何表现的。 此外,如果您测试抽象类的实现方法,那么您将测试与抽象类实现绑定 - 但是您不能创建抽象类的对象,那么这样的测试有什么用? :)

【讨论】:

所有编写的代码都应该有测试,不管它是否被使用。如果您的实现覆盖了一些抽象实现,您也必须对其进行测试,而不是跳过抽象实现。 如果一个抽象类实现了任何方法,那么这个方法应该被测试。这并不难理解。抽象类可以具有可以被类实现覆盖的方法实现。这意味着,您还必须确保从抽象类测试原始实现。 这就是您不必在抽象类中测试它的关键!您从抽象类派生,您没有覆盖已实现的方法,并且您在派生类的测试中对此进行了测试,结果将是正确的。但是您正在测试派生类而不是抽象类。但我想你可以有许多不同的方法,试图找到“金蛋”就像讨论什么更好:C# 或 Java :)

以上是关于如何对抽象类进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何对扩展/继承第 3 方类的类进行单元测试

如何在 Swift 中对私有或内部函数进行单元测试?

如何在VS2008中使用集成单元测试来测试抽象类

服务定位器模式下的单元测试

Django:对抽象模型进行单元测试的最佳方法

如何使用私有构造函数对类进行单元测试?