[英]Junit: local variables and void methods
我对单元测试还很陌生,并且已经在线阅读了很多材料,但是在弄清内容方面有些麻烦。
例如:如果我有以下代码:
public class RandomClass
{
int a = 4;
public void foo(Object obj)
{
if(a == 4)
{
AnotherObject anotherObj = new AnotherObject();
anotherObj.setAttribute(obj.getFiled());
//Method call that will be suppressed
Anotherclass.anotherMethod(anotherObj);
}
}
}
我想到写这样的junit测试用例:
@Test
public void testFoo()
{
int a=4;
RandomClass randomClass = new RandomClass();
Object object = new Object();
object.setField("hey");
randomClass.foo(object);
}
我在这里有几个问题。 我如何从我的junit设置整数a? 我现在设置的方式不会对单元测试用例产生任何影响。 当我调试单元测试时,a的值为NULL,因此它永远不会通过if条件!
另外,方法foo返回一个void,所以我可能会测试/声明什么?
编写单元测试时,有两种主要技术:
您会看到,您实际上编写了“难以测试”的代码-因为您在生产代码中为AnotherClass调用了new 。 这似乎没什么大不了,但是取决于AnotherClass是关于什么的……您真的不应该这样做!
任何状况之下; 我建议您观看这些视频,以学习如何编写更适合单元测试的代码。
测试通常从“设置”,“准备”或“安排”步骤开始,在该步骤中,将创建或修改被测对象,使其处于该特定测试所需的状态。
因此,如果RandomClass
对象中的字段a
需要具有值4
(例如),则测试需要创建将该值作为构造函数参数传递的对象, 或者通过调用setter方法在该对象中设置值或直接访问该字段。 在最坏的情况下,您可能需要使用Reflection来设置字段,但这将指示正在测试的类中存在设计问题。
下一步是测试代码。 这是“安排,行动,声明”术语(简称AAA)中的“行动”步骤。
最后,最后一步是“声明”(验证)所测试的代码是否按照预期执行。
如果所测试的方法具有void
返回类型,则测试应通过状态验证或行为验证来验证其是否达到了预期的效果。
在第一种情况下,测试将在被测对象中调用某种getter方法,并将其用于某种类型的“断言”(例如assertEquals(expectedValue, actualValue)
)。
在第二种情况下,测试将使用一些模拟库,以验证预期的调用是从被测代码对一个或多个依赖项(被测类所依赖的其他对象或类)进行的。 例如,这里的测试可以验证RandomClass#foo
是否确实调用了Anotherclass.anotherMethod(...)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.