通过方法名assertXxx你可以让JUnit知道你想要的结果,其中Xxx是True、Fase、Equals或者其它条件。JUnit记录assertXxx方法的通过/失败状态,并在执行完所有测试后反馈给你。这儿是一些JUnit中有签名和操作描述的断言(assert)方法:
assertTrue(String errorMessage, boolean booleanExpression): 检查booleanExpression值是否为true。如果不是,把errorMessage添加到错误报告的显示列表中。
assertFalse(String errorMessage, boolean booleanExpression): 检查booleanExpression值是否为false。如果不是,把errorMessage添加到错误报告的显示列表中。
assertEquals(String errorMessage, Object a, Object b): 检查对象a是否等于对象b,通过equals方法,如果不是,把errorMessage添加到错误报告的显示列表中。对象a是期望值,对象b是要测试的程序实际返回的值。
assertNull(String errorMessage, Object o): 检查对象o是否为null。如果不是,把errorMessage添加到错误报告的显示列表中。
要查看所有断言方法的完整列表,请参考Assert类的javadoc文档(http://www.junit.org/junit/javadoc/index.htm)。
你可以在整个测试代码中随意使用assertXxx语句,来确认你要测的代码中某个条件结果为true(或者false,视情况而定)。
五、指定要运行的测试(Specifying Which Tests to Run)
要运行你的测试,你需要:
一个TestRunner类的实例。
一个测试类(例如本例的MyTestClass类)的实例,它包含你要运行的测试的。这个类必须继承junit.framework.TestCase。
告诉这个TestRunner实例你的MyTestClass实例中哪些测试要运行的途径。
创建TestRunner的实例和指定MyTestClass实例非常容易,你可以通过下面的命令:
java junit.textui.TestRunner MyTestClass
对别的UI可以用其相应的TestRunner代替junit.textui.TestRunner,例如AWT的junit.awtui.TestRunner和Swing的junit.swingui.TestRunner。你还要用你自己的测试类的名字替换MyTestClass。
有两种途径可以让TestRunner知道你要运行MyTestClass类中的哪些测试。一个是显式途径,一个是默认途径。在MyTestClass中,你可以选择是否包含一个public static方法suite,这个方法没有任何参数,返回Test对象。更准确地说,它返回一个实现Test接口的对象,因为Test是接口,不是类。大多数时候你都使用TestSuite和你自己的TestCase子类,TestSuite和TestCase都实现了Test接口。
如果你在MyTestClass方法中省略了suite方法,那么TestRunner通过reflection机制找到MyTestClass类中所有以“test”为前缀命名的方法,并运行它们。这是通知TestRunner要运行哪些测试的默认途径。
如果你在MyTestClass中实现了suite方法,TestRunner调用suite方法,通过suite方法返回的Test对象,TestRunner获悉它要进行的测试。这是显式途径。TestCase和TestSuite类都实现Test接口,意味着你可以只返回一个TestCase,也可以返回一个包含0到多个TestCase/TestSuite的TestSuite,这样可以进行多个测试和层次测试。
在junit.framework.TestCase中指定要运行的测试
在TestCase中有两种方式可以指定测试方法:一个静态一个动态。静态方法是重TestCase的runTest方法,在其中调用你的测试。例如:
import junit.framework.TestCase;
public class MySimpleTest extends TestCase {
public MySimpleTest(String name) {
super(name);
}
public void runTest() {
testTurnLeft();
}
public void testTurnLeft() {
... code here ...
}
}
有时简单灵活的重载TestCase.runTest的方式是用一个匿名内部类。下面的代码描述了这种方式:
TestCase testCase = new MySimpleTest("myNameForTurnLeft") {
public void runTest() {
testTurnLeft();
}
}
匿名内部类让你在实例化test类的类中重载runTest,这样在不同的地方可以有不同的runTest实现,它们都使用MySimpleTest作为实际的测试方法。如果你在test类的suite方法中初始化它自己,这个初始化test类的类是它自己。
通过构造器的name参数可以在TestCase中动态指定测试方法。对上面的MySimpleTest类,你可以写成:
TestCase testCase = new MySimpleTest("testTurnLeft");
因为你没有重载runTest,TestCase类的默认实现将通过reflection找到方法testTurnLeft。你可以用任何你喜欢的名字代替“testTurnLeft”。
六、用junit.framework.TestSuite指定多层测试(Specifying a Hierarchy of Tests to Run With junit.framework.TestSuite)
TestSuite类可以把多个测试打包成一组。基本形式如下:
TestSuite testSuite = new TestSuite();
testSuite.addTest(new MySimpleTest("testTurnLeft"));
testSuite.addTest(new CalculatorTest("testIsDivisor"));
testSuite.addTest(new TestSuite(MyThirdTest.class));
前两个addTest方法是直接调用。TestSuite.addTest方法接受实现Test接口的对象作参数。MySimpleTest和CalculatorTest类都是TestCase的子类,而TestCase实现Test接口。通过前两个addTest方法,你只是把两个测试方法添加到TestSuite实例要执行的测试列表中。
第三个addTest调用描述如何通过在TestSuite实例中包含TestSuite实例来创建层次测试。TestSuite类实现Test接口,所以可以作为addTest方法的参数。第三个addTest调用中,新的TestSuite对象包含MyThirdTest类所有的testXxx方法。没有任何限制要求addTest方法中指定的TestSuite实例是单层列表,子TestSuite还可以包含子TestSuite。