我知道有人问过类似的问题,但我没有找到明确的解决方案。我正试图从一个大班级嘲笑一个私人领域。私有字段在一些早期方法中被实例化,我正在尝试对引用该字段的后一种方法进行单元测试。
所以我班上有一个早期的方法:
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;
}
鉴于我有一个大类,这只是我想测试的一种方法,是否有可能只是模拟这个私有字段?我错过了一些基本的东西,还是应该考虑其他方法?
答案 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" />