我有一个包含以下代码的方法:
ansible-pull
现在doSomething1,doSomething2,doSomething3是无效方法。 如何对myMethod进行单元测试? 例如:如果满足condition1,检查是否调用了doSomething1。
我们可以做些什么来重构这个以使其易于测试?
答案 0 :(得分:1)
一般方法可能是3个测试用例。每个测试用例都会运行一个条件。对于每个测试用例:
有许多策略可以消除模拟的需要。
如果doSomethingX
是一个实例方法,那么您可以创建一个test specific subclass并覆盖doSomethingX
并在子类中进行断言。
你也可以重构你的方法,要求调用者注入doSomethingX
依赖(依赖注入)
public void myMethod(somethingStrategy)
然后测试可以轻松配置模拟对象并使用模拟对象调用myMethod
。
依赖注入可以通过class be instantiated和somethingStrategy
来在类级别上进行。
答案 1 :(得分:0)
(a)这些方法无效的事实意味着它们的结果无关紧要,我们只是不在乎。但是你需要测试结果,因此需要知道结果。所以这是一个巨大的红旗,代码不是固定的,需要重构。
(b)嘿,这可能是无法改变的遗留代码,所以如果你的方法真的是空洞,那么下面的重构可能会有所帮助,如果你断言myNewMethod2和doSomething2 / 3被调用一次/不根据条件(例如通过MOQ单元测试框架)调用所有depedndant
public myNewMethod()
{
bool cnd1 = (condition1);
bool cnd2 = (condition2);
if(cnd1)
{
myNewMethod2(cnd2);
}
}
public myNewMethod2(bool cnd2)
{
doSomething1();
myNewMthod3(cnd2);
}
public myNewMethod3(bool cnd2)
{
if (cnd2)
{
doSomething2();
}
else
{
doSomething3();
}
}
(c)空洞的另一种策略,我不是很喜欢它,但保留原始代码基本完整,是:
public void myMethod() {
try
{
if (condition1) {
doSomething1();
if (condition2) {
doSomething2();
} else {
doSomething3();
}
}
catch(Exception ex)
{
//
}
}
然后,您的单元测试可以断言不会抛出任何异常。不理想,但如果需要必须......