嘲弄一个私人领域

时间:2012-06-26 18:17:38

标签: c# unit-testing moq rhino-mocks nmock

我知道有人问过类似的问题,但我没有找到明确的解决方案。我正试图从一个大班级嘲笑一个私人领域。私有字段在一些早期方法中被实例化,我正在尝试对引用该字段的后一种方法进行单元测试。

所以我班上有一个早期的方法:

public bool validateAll(ref DataEntry[] oEntries, string sMediaPlanId, ITemplateGenerator oTempGen)
{
  ...
  // private field that I am trying to mock
  this._sMediaPlanObjective = (MPWrapper.Instance).getMediaPlanObjective(sMediaPlanId);
  ...
}

我正在尝试对引用私有字段的方法进行单元测试:

public bool validateFlightObjective(ref MPDataEntry oEntry)
{
  ...
  string entryFlightObjective = oEntry.getFlightObjective();
  string mediaPlanObjective = this._sMediaPlanObjective;

  if (entryFlightObjective != mediaPlanObjective)
  {
    return false;
  }
  ...

  return true;      
}

鉴于我有一个大类,这只是我想测试的一种方法,是否有可能只是模拟这个私有字段?我错过了一些基本的东西,还是应该考虑其他方法?

3 个答案:

答案 0 :(得分:5)

你不能模仿任何私有,静态或本质上 - 不可覆盖的(这是一个免费的模拟库limitation)。

在这种情况下您通常会做什么(当private成员 有进行测试时),您正在将private成员提取到单独的班级{{{ 3}}它将测试类作为依赖。

在您的情况下,您实际上需要提取创建_sMediaPlanObjective的代码,这就是这一行:

this._sMediaPlanObjective =
    (MPWrapper.Instance).getMediaPlanObjective(sMediaPlanId);

提供getMediaPlanObjective方法的对象应该注入到测试类中。如果你这样做,你可以简单地模拟该对象并告诉它返回_sMediaPlanObjective的模拟版本。

答案 1 :(得分:0)

没有理由对private字段进行任何类型的测试。

使用对象可以引用public方法作为对象API。 对象本身可以根据您对其执行的操作来改变状态 - 但它将反映在其他public方法/访问DAL(DB / Registry / File /任何其他不在内存中的资源)中

因此,在您的情况下,您可以进行类似的单元测试:

调用初始化私有字段的方法,并按 -

调用
  • 使用您知道必须根据validateFlightObjective“想要成为状态”返回false的参数调用_sMediaPlanObjective,并验证结果是否为假。

  • 使用您知道必须根据validateFlightObjective“想要成为状态”返回true的参数调用_sMediaPlanObjective,并验证结果是否为真。

如果你发现很难测试这个对象,那么这可能是一种“气味” - 也许你有不止一个责任,你应该开始重构并将类拆分为更小的类,这将更容易测试

它有点长但我希望它有用

答案 2 :(得分:0)

您可以使用JustMock框架。 例如:

<Switch
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="New Switch"
  android:id="@+id/switch1"
  android:theme="@style/SwitchTheme" <--- Important line
  android:layout_alignParentTop="true"
  android:layout_centerHorizontal="true"
  android:layout_marginTop="78dp" />