清单 3. 在 Maven 项目中测试的示例类
package com.prometheus.run;
import java.io.IOException;
import java.io.InputStream;
public class CommandExecutor extends Executor{
...
public String executeCommand(String command){
...
try {
Process child = performCommandExecution(command);
stream = child.getInputStream();
sb = processStream(stream);
...
}
...
return sb.toString();
}
protected StringBuffer processStream(InputStream stream) throws IOException {
...
sb = new StringBuffer();
while ((c = stream.read()) != -1) {
sb.append((char)c);
}
return sb;
}
...
}
在 CommandExecutor 类中,executeCommand() 方法将调用同一个类 processStream() 中的受保护方法。在 processStream() 方法中,将在 while() 循环中创建一个新 StringBuffer 实例并且处理 InputStream。清单 4 显示了测试类,还显示了测试的主要部分。
清单 4. Maven 项目中的示例测试类
package com.prometheus.run;
import com.prometheus.run.CommandExecutor;
...
public class CommandExecutorTest extends TestCase {
...
public class MockProcess extends Process{
...
public InputStream getInputStream(){
String source= "This is a mock string";
return new ByteArrayInputStream(source.getBytes());
}
public OutputStream getOutputStream(){
return null;
}
public int waitFor(){
return 1;
}
}
public void testExecuteCommmand(){
String expected = "This is a mock string";
String actual = commandExecutor.executeCommand("lsmod");
assertEquals(expected, actual);
...
}
}
测试类 CommandExecutorTest 相对简单。虽然给出的详细信息不多,但是此单元测试的基本目标是在测试时通过类的 performCommandExecution() 方法调用来模拟 Process 类的行为。
必须注意的是,要让 Grester 成功运行,项目必须编译代码源文件和测试源文件并成功运行任意一个测试和所有测试(注:由于这个原因,test-compile Maven 阶段将标记允许 Grester 运行且不能提前运行的阶段)。下一步是简单地在项目的 pom.xml 文件中附加 Grester 的 Maven 插件配置。此配置放在 pom.xml 文件的默认构建部分中或任何常规的 Maven 配置文件中。
把 Grester 与项目联系在一起
清单 5 显示了放在示例项目的 pom.xml 文件中的 Grester 插件的示例配置。注意,groupId 要对应于 org.apache.Maven.plugins 并且版本应该是新的 Grester 插件:V0.3。
清单 5. 示例项目中的 Grester 插件配置
<plugins>
...
...
<!-- START MAVEN GRESTER PLUG-IN CONFIGURATION -->
<plugin>
<groupId>org.apache.Maven.plugins</groupId>
<artifactId>Maven-Grester-plugin</artifactId>
<version>0.3</version>
<configuration>
<codeSources>src/main/java/com/prometheus/run</codeSources>
<testSuiteClass>com.prometheus.run.CommandExecutorTest</testSuiteClass>
</configuration>
<executions>
<execution>
<id>inspectSourcesCodeWithGrester</id>
<phase>test</phase>
<goals>
<goal>inspect</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- END MAVEN GRESTER PLUG-IN CONFIGURATION -->
...
</plugins>
注意,项目已被设为在 Maven 的测试阶段运行 Grester 的 inspect 目标。codeSources 将指向包含测试类 CommandExecutorTest 的源代码的目录。它可以像简单地指向实际类 CommandExecutor 一样排除文件扩展名。在 Grester 附带的 README.txt 文件中提到了扩展名 .Groovy,但是应当注意的是,目前没有对 Grester 的支持。