定义并实现了账户的增、删、改、查操作,当然也不能少了相应的测试。测试代码位于src/test/java/目录下,测试资源文件位于src/test/resources/目录下。上一节SpringFramework的定义要求项目classpath下有一个名为account-service.properties的文件,并且该文件中需要包含一个persist.file属性,以定义文件存储的位置。为了能够测试账户数据的持久化,在测试资源目录下创建属性文件account-service.properties。其内容如下:
该文件只包含一个persist.file属性,表示存储账户数据的文件路径,但是它的值并不是简单的文件路径,而是包含了${project.build.testOutputDirectory}。这是一个Maven属性,这里读者暂时只要了解该属性表示了Maven的测试输出目录,其默认的地址为项目根目录下的target/test-classes文件夹。也就是说,在测试中使用测试输出目录下的persist-data.xml文件存储账户数据。
现在编写测试用例测试AccountPersistService。同样为了避免冗余,这里只测试readAccount()方法,见代码清单8-8。
代码清单8-8 AccountPersistServiceTest.java
该测试用例使用与AccountPersistService一致的包名,它有两个方法:prepare()与testReadAccount()。其中prepare()方法使用了@Before标注,表示在执行测试用例之前执行该方法。它首先检查数据存储文件是否存在,如果存在则将其删除以得到干净的测试环境,接着使用account-persist.xml配置文件初始化SpringFramwork的IoC容器,再从容器中获取要测试的AccountPersistService对象。最后,prepare()方法创建一个Account对象,设置对象字段的值之后,使用AccountPersistService的createAccount()方法将其持久化。
使用@Test标注的testReadAccount()方法就是要测试的方法。该方法非常简单,它根据id使用AccountPersistService读取Account对象,然后检查该对象不为空,并且每个字段的值必须与刚才插入的对象的值完全一致。
该测试用例遵守了测试接口而不测试实现这一原则。也就是说,测试代码不能引用实现类,由于测试是从接口用户的角度编写的,这样就能保证接口的用户无须知晓接口的实现细节,既保证了代码的解耦,也促进了代码的设计。