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