为了测试” JVM initial heap size rating algorithm ”,我们需要获得三个输入参数。然而,获取这三个参数并不是那么容易。
为了简化测试环境,我们利用 Mock 对象来设置这些参数。
Mock 对象是单元测试经常用到的一种技术,Mock 对象能模拟实际对象的行为,并且提供了额外的行为控制接口。还有一个常用到的词是 Dummy 对象。 Mock 和 Dummy 的含义经常被混淆。在这里,我们认为 Dummy 对象没有提供额外的行为控制接口。
对于” JVM initial heap size rating algorithm ”,我们需要一个 Mock 类,它的行为与“ InitialHeapSize.java ”相同(“ InitialHeapSize.java ”是 “ JVM initial heap size rating algorithm ”的 Java 代码)。我们把这个 Mock 类命名为“ MockInitialHeapSize.java ”。一个 Client 类可以把“ initialHeapSize ” , “ currentMemoryPoolSize ” , 和“ overallMemoryOnPartition ” 直接设置到“ MockInitialHeapSize ”对象中。参见清单 2
清单 2. MockInitialHeapSize.java
2 // 设置 InitialHeapSize
3 public void setInitialValue(String initialValue){
4 this.initialValue = initialValue;
5 }
6 // 设置 MemoryPoolSize
7 public void mockSetMemoryPoolSize(String size) {
8 try{
9 this.currentSettingOfMemoryPoolSize=Float.parseFloat(size);
10 }catch(NumberFormatException ne){
11 Advisor.getLogger().severe("size: "+size+" are not an float value.");
12 }
13 }
14 // 设置 OverallMemory
15 public void mockSetOverallMemory(String size) {
16 try{
17 this.overallMemoryOnPartition=Float.parseFloat(size);
18 }catch(NumberFormatException ne){
19 Advisor.getLogger().severe("size: "+size+" are not an float value.");
20 }
21 }
22 ……
23 }
将测试数据保存到配置文件中
正如我们在文章开头提到的,我们希望把测试数据保存成格式化的形式,以便对这些数据进行维护和复用。表 1展示了用一个 Excel 文件 “ MockInitialHeapSize_rating.xls ” 保存所有的测试数据的例子。 这个文件完全可以用于功能测试的文档编写。
表 1. JVM initial heap size 测试数据setInitialValue mockSetOverallMemory mockSetMemoryPoolSize result 31 92 92 5 31 123 123 5 31 124 124 5 32 95 95 5 32 127 127 3 32 128 128 3 47 140 140 5 47 187 187 3 47 188 188 3 48 143 143 5 48 191 191 3 48 192 192 1 49 146 146 5 49 195 195 3 49 196 196 1 1024 3071 3071 5 1024 4095 4095 3 1024 4096 4096 1 1025 3074 3074 5 1025 4009 4009 3 1025 4100 4100 3 1537 4610 4610 5 1537 6147 6147 5 1537 6148 6148 5
表 1中,每一行都代表了一组测试数据,包括输入参数和期望结果。三个输入参数“initialHeapSize”,“currentMemoryPoolSize”,“overallMemoryOnPartition”分别保存到了三列中:“setInitialValue”,“mockSetOverallMemory ”和“mockSetMemoryPoolSize”。期望结果保存到了“result”列 ,测试代码将从这个文件中获取测试数据。
配置文件的格式是可以变化的,只需要提供相应的 SettersMap 和 SettersMapFactory 类就可以了。