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

本文关键字:单元测试 抽象类 | 更新日期: 2023-09-27 18:13:03

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

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

谢谢。

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

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

有两种相反的观点:

  • 不要测试抽象类本身,测试从它继承的具体类
  • 抽象类也应该被测试,因为它提供了一些跨所有继承类共享的内置逻辑,所以你只测试抽象类中的基本逻辑一次

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

  1. 只测试实现类。

  2. 你总是可以为测试创建一个特定的实现,而不增加额外的功能。

  3. 听测试。使用mock工具来测试抽象类和私有方法等是一种测试代码味道

use from mockrepository:

[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" ) );
           }
       }

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