下图是为com.example.android.snake.SnakeView写的SnakeViewTest的片段:

  如图所示,SnakeViewTest中有一个test01InitialCondition()方法,在这个测试用例中检查了所有在setUp()中定义的初始条件的正确性。这是推荐的测试方式。因为setUp()中如果有错误,会影响所有测试用例的结果。由于JUnit框架是按照test后面的字母排序决定测试方法的执行顺序,因此示例中使用了test01这样的前缀以使该用例第一个被执行。

  SnakeViewTest中使用了util.setStatusText()和util.getStatusText()方法。这里的util是测试包中TestUtil类的实例。将测试中用到的一些公用方法放到一个类中管理,有助于提高代码的复用度,降低被测应用代码变化后对测试代码的影响。

  下图是TestUtil类的内容:

  对于被测类中的protected和private类型的变量和方法,可以用反射的方法访问,如getStatusText() 和setStatusText()。

  在一般的JUnit单元测试时,会建议测试代码和被测代码的包名保持一致,以便于访问protected类型的变量和方法。OPhone单元测试代码也可以放在与被测代码同名的包中,方案如下:

  1、测试代码放在单独的工程中,该工程的包名与被测代码包名一致;

  2、在被测应用代码下新建目录,如tests/src,在该目录下增加与被测代码使用相同包名的测试代码,并将该目录添加到整个工程的编译路径中。

  但这两种方案都有一个共同的缺点:需要修改被测应用的代码,如被测应用的AndroidMenifest.xml中必须增加uses-liibray和Instrumentation信息。当需要特殊的测试资源时,方案2还必须修改被测应用的resource资源,并不能得到单独的测试apk。