我正在为我的控制器方法编写单元测试,许多方法调用其他方法,然后又调用其他方法,直到最终返回结果。现在,从我对最佳实践的阅读中可以看出,即使实际上已经通过另一种方法“测试”了一种方法,也应该对每种方法进行测试。
要对此进行透视,可以说我有这3种方法,并且我做了一个assertTrue(MethodA)是否真的有必要先测试MethodB,然后再测试MethodC?如果可以,为什么?
public Boolean MethodA(Object o)
{
try {
//Do stuff
return MethodB(Object o);
}
catch(Exception e)
{
return false;
}
}
public Boolean MethodB(Object o)
{
try {
//Do stuff
return MethodC(Object o);
}
catch(Exception e)
{
return false;
}
}
public Boolean MethodC(Object o)
{
try {
//Do stuff with o
//return True
}
catch(Exception e)
{
return false;
}
}
答案 0 :(得分:2)
这实际上取决于您和您的团队。在这种情况下,我可能会全部测试。
一个原因是:我还能如何确保methodA()
返回false
时是由于在methodB()
中进行的计算还是那里的异常?同样的问题也适用于methodC()
...如果引发异常,我们会得到false
,但是我如何知道(实际上:确保)异常是由于异常还是实际的呢?计算?
如果您要通过methodA()
进行测试,则仅该测试可能会变得过于复杂,并且您会为该特定测试添加过多的内部工作逻辑。尝试从外部角度测试/挑战您的方法。您可能想单独测试从外部可见的所有内容。另外:使您的测试足够简单,以便您返回时可以轻松掌握为何用这种方法进行测试。
答案 1 :(得分:2)
是的,您应该对它们全部进行测试。在将来的某个时候,一种调用方法(例如MethodA
)的实现可能会更改,您需要测试所有旧用法是否仍然适用。在这种情况下,我将考虑以下几点:
MethodA
而不直接调用MethodC
?我并不是说您必须消除所有内部调用,但是公共方法应该公开唯一的功能,并且每个功能只能通过一个方法使用。答案 2 :(得分:2)
查看此问题How to best test Java code?。 关于如何测试以及需要测试多少代码,有一些好的建议 (答案https://stackoverflow.com/a/1139266/10606957说明了编程中的80:20方法)。 即使这些答案针对的是更大的项目,也最好从头开始学习。
注意:本来可以发表评论,但我尚未解锁评论喷气机^^