单元测试 – 单元测试模板方法设计模式

前端之家收集整理的这篇文章主要介绍了单元测试 – 单元测试模板方法设计模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设以下模板方法实现:
public abstract class Abs
  {
    void DoYourThing()
    {
      log.Info("Starting");
      try
      {
        DoYourThingInternal();
        log.Info("All done");
      }
      catch (MyException ex)
      {
        log.Error("Something went wrong here!");
        throw;
      }
    }

    protected abstract void DoYourThingInternal();

  }

现在,有很多关于如何测试Abs类的信息,并确保调用DoYourThingInternal.
但是,假设我想测试我的Conc类:

public class Conc : Abs
  {
    protected override void DoYourThingInternal()
    {
      // Lots of awesome stuff here!
    }
  }

我不想做conc.DoYourThing(),因为这将调用已经单独测试的父方法.

我想只测试重写方法.

有任何想法吗?

我不认为DoYourThingInternal()与DoYourThing()分开(就像在两个单独的代码模块中可以单独测试一样),因为无论如何你都无法单独实例化你的抽象类,而且2个方法将会总是一起跑.此外,DoYourThingInternal()可以访问您班级的所有受保护成员,并可以修改它们,对DoYourThing()有潜在的副作用.所以我认为测试DoYourThing()与DoYourThingInternal()的具体实现完全隔离是危险的.

但是,这并不意味着您不能对DoYourThing()的预期行为进行单独测试,这些测试必须在Abs的所有实现和DoYourThingInternal()的预期行为中保持相同.

您可以使用(抽象)基本测试类来定义对DoYourThing()期望的一般行为的测试.然后创建与Abs的实现一样多的测试子类,并对每个实现的细节进行单元测试.

来自基础测试类的测试将被继承,当您运行任何子类的测试时,DoYourThing()的继承测试也将运行:

public abstract class AbsBaseTest
{
  public abstract Abs GetAbs();

  [Test]
  public void TestSharedBehavior() 
  {
    getAbs().DoYourThing();

    // Test shared behavior here...
  }
}

[TestFixture]
public class AbsImplTest : AbsBaseTest
{
  public override Abs GetAbs()
  {
    return new AbsImpl();
  }

  [Test]
  public void TestParticularBehavior()
  {
    getAbs().DoYourThing();

    // Test specific behavior here
  }
}

http://hotgazpacho.org/2010/09/testing-pattern-factory-method-on-base-test-class/

不知道所有单元测试框架是否支持抽象测试类继承(我认为NUnit确实如此).

原文链接:https://www.f2er.com/javaschema/281312.html

猜你在找的设计模式相关文章