你可以在Seam的更复杂的示例应用程序中找到大量关于集成测试的用法,还有在Ant或者Eclipse的TestNG插件下运行这些测试的使用说明。
31.3.1. 利用Mock数据进行集成测试
如果你需要在每个测试之前在数据库中插入或清除数据,你可以使用DBUnit进行Seam的集成测试。要做到这一点,要继承DBUnitSeamTest而不是SeamTest。
你需要提供数据集给DBUnit:
<dataset>
<ARTIST
id="1"
dtype="Band"
name="Pink Floyd" />
<DISC
id="1"
name="Dark Side of the Moon"
artist_id="1" />
</dataset>
并通过覆盖prepareDBUnitOperations()来告诉Seam:
protected void prepareDBUnitOperations() {
beforeTestOperations.add(
new DataSetOperation("my/datasets/BaseData.xml")
);
}
如果没有指定其它的操作作为构造器参数DataSetOperation的操作默认是DatabaseOperation.CLEAN_INSERT。 在调用每个@Test方法前,上述的示例会先清除BaseData.xml中定义的所有的表,然后插入BaseData.xml中定义的所有的数据行。
如果你需要在一个测试方法执行后进行额外的清除工作,添加操作到afterTestOperations列表中。
你需要通过设置一个名为datasourceJndiName的TestNG测试参数来告诉DBUnit你正在使用的数据源:
<parameter name="datasourceJndiName" value="java:/seamdiscsDatasource"/>
31.3.2. Seam Mail集成测试
警告!这个功能仍在开发当中。
集成测试Seam Mail相当的简单:
public class MailTest extends SeamTest {
@Test
public void testSimpleMessage() throws Exception {
new FacesRequest() {
@Override
protected void updateModelValues() throws Exception {
setValue("#{person.firstname}", "Pete");
setValue("#{person.lastname}", "Muir");
setValue("#{person.address}", "test@example.com");
}
@Override
protected void invokeApplication() throws Exception {
MimeMessage renderedMessage = getRenderedMailMessage("/simple.xhtml");
assert renderedMessage.getAllRecipients().length == 1;
Inte.netAddress to = (InternetAddress) renderedMessage.getAllRecipients()[0];
assert to.getAddress().equals("test@example.com");
}
}.run();
}
}
我们与往常一样创建一个新的FacesRequest。 在 invokeApplication 里我们通过传递消息的viewId去渲染getRenderedMailMessage(viewId);的消息。 这个方法返回已经渲染完成的消息,你可以继续进行你的测试。你当然可以同时使用任何一项标准JSF的生命周期的方法。
还有就是不支持渲染标准JSF组件,所以你不能方便地测试邮件消息的内容主体。