Test a JavaBean
程序员文章站
2022-03-03 12:32:12
...
[b]问题:[/b]
如果要测试一个JavaBean,但对你来说好像写的测试似乎千篇一律又不放心。
[b]背景:[/b]
因为JavaBean跟一堆get和set方法差不多,所以你为bean编写的测试代码看起来重复性很大,这肯定无法让你感到满意,其实有很多人也都这么认为。
[b]诀窍:[/b]
在大多数情况下,测试JavaBean没什么特别的。
1. bean的一个属性就是直接与域内的数据进行交互而且不进行计算,因此测试相应的set和get方法是没多大用的。不要浪费时间做这样的事情。
2. 对于需要计算的属性值,写简单的测试程序验证属性值是否被正确的计算。
3. 对于bean的事件方法,没有什么特殊的要做;因此,将它的方法当做普通的简单方法来测试就可以了。
4. 对于bean的方法,没什么特殊的要做;因此,将它的方法当做普通的简单方法来测试就可以了。
5. 对于bean的事件方法,比如属性改变的事件,那要看前面怎么来测试了。如果将bean当作一个事件源,因为它的确也就是。
在JavaBeans方面唯一的测试技巧是正常性测试。JavaBean规范要求无参数的构造函数,然而大多数的bean都要求属性值非空。这就意味着:当构造函数完成以后,得到的对象其实并没有被完全初始化。我们称之为“不正常对象”,因为如果你这时候使用它的任何方法,你都无法确定你将获得什么结果。
为了实现正常性测试,请引入一个名为isValid()的方法,用它来确认必要的属性值是否确实为非空。你的测试使用的isValid()方法,实际上表明了哪些属性值是必要的,哪些是可以选的。就像有人说的一样,如果java.util.Calender也提供了这种方法就很好啊。
在一个简单的JavaBean类中,如果属性值直接映射为类中的一个域,那么一般来讲你无须为set方法编写测试,因为他们过于简单而很难出错。但是,如下的JavaBean测试程序仍然是值的写的。
这个测试展示了,如果程序程序设置了accountID,target accountID和要转账的金额,那就说明command已经准备好,可以执行了。在这里为了更好地表明意图,我们将isValid()改为isReadyToExecute().这个测试验证了是否已经为转账准备了充足的条件,这个命令是否已经有效、是否可以被执行了。为了完整,我们进入如下测试:
这个测试说明,如果没有提供转账的数额,命令就不能执行。
如果要测试一个JavaBean,但对你来说好像写的测试似乎千篇一律又不放心。
[b]背景:[/b]
因为JavaBean跟一堆get和set方法差不多,所以你为bean编写的测试代码看起来重复性很大,这肯定无法让你感到满意,其实有很多人也都这么认为。
[b]诀窍:[/b]
在大多数情况下,测试JavaBean没什么特别的。
1. bean的一个属性就是直接与域内的数据进行交互而且不进行计算,因此测试相应的set和get方法是没多大用的。不要浪费时间做这样的事情。
2. 对于需要计算的属性值,写简单的测试程序验证属性值是否被正确的计算。
3. 对于bean的事件方法,没有什么特殊的要做;因此,将它的方法当做普通的简单方法来测试就可以了。
4. 对于bean的方法,没什么特殊的要做;因此,将它的方法当做普通的简单方法来测试就可以了。
5. 对于bean的事件方法,比如属性改变的事件,那要看前面怎么来测试了。如果将bean当作一个事件源,因为它的确也就是。
在JavaBeans方面唯一的测试技巧是正常性测试。JavaBean规范要求无参数的构造函数,然而大多数的bean都要求属性值非空。这就意味着:当构造函数完成以后,得到的对象其实并没有被完全初始化。我们称之为“不正常对象”,因为如果你这时候使用它的任何方法,你都无法确定你将获得什么结果。
为了实现正常性测试,请引入一个名为isValid()的方法,用它来确认必要的属性值是否确实为非空。你的测试使用的isValid()方法,实际上表明了哪些属性值是必要的,哪些是可以选的。就像有人说的一样,如果java.util.Calender也提供了这种方法就很好啊。
在一个简单的JavaBean类中,如果属性值直接映射为类中的一个域,那么一般来讲你无须为set方法编写测试,因为他们过于简单而很难出错。但是,如下的JavaBean测试程序仍然是值的写的。
public void testBankTransferCommandValid(){
BankTransferCommand command = new BankTransferCommand();
command.setSourceAccountId("123-456A");
command.setTargetAccountId("987-654B");
command.setAmount(Money.dollars(1000));
assertTrue(command.isReadyToExecute());
}
这个测试展示了,如果程序程序设置了accountID,target accountID和要转账的金额,那就说明command已经准备好,可以执行了。在这里为了更好地表明意图,我们将isValid()改为isReadyToExecute().这个测试验证了是否已经为转账准备了充足的条件,这个命令是否已经有效、是否可以被执行了。为了完整,我们进入如下测试:
public void testNeedsAmount(){
BankTransferCommand command = new BankATransferCommand();
command.setSourceAccountId("123-456");
command.setTargetAccountId("987-654B");
//不要设置数量
assertFalse(command.isReadyToExecute());
}
这个测试说明,如果没有提供转账的数额,命令就不能执行。