3.5使用Robolectric和JUnit测试4
问题
你喜欢单元测试,但Android的原始测试框架是基于古老的Android 3.8,它运行在模拟器,所以它的速度很慢。
解
使用Robolectric,JUnit 4测试跑者是快。
讨论
这些说明是为Eclipse设置的。
假设您的“主”项目设置为正常的Android项目,在此项目中创建一个名为例如“test”的文件夹(不要将其标记为源文件夹),然后执行以下操作:
1.使用新建项目向导创建一个单独的项目(不使用Android测试项目向导)
2.使此项目依赖于您的主项目(构建路径→配置)
3.从新项目的构建路径中删除默认源文件夹src
4.仍然在构建路径中,单击链接其他源;浏览并选择| / MainProject / test
5.将Robolectric-3.1.jar添加到新项目的类路径,通过将其复制到libs /或通过在构建脚本(Maven或Gradle)中指定它。
6.通过从“新建类→JUnit测试”向导中选择JUnit 4,将JUnit 4(而不是3.8!)添加到新项目的类路径中。
7.注释您的JUnit 4测试以使用RoboLectrict测试运行器(示例如下)
8.在需要时使用Robolectric“阴影”类
接下来,创建一个具有以下特殊属性的Eclipse运行配置(此部分引自RoboLectric网站):
1.运行→运行配置
2.双击JUnit(不是Android JUnit测试)
名称:MyProjectTestConfiguration
4.选择在所选项目,包或源文件夹中运行所有测试:单选按钮
5.单击搜索按钮
6.选择MyProjectTest
7. TestRunner:JUnit 4
8.单击链接多个启动器可用选择一个在对话框的底部
9.选中使用配置特定设置框
10.选择Eclipse JUnit Launcher
11.单击“确定”
12.单击“参数”选项卡
13.在工作目录下:选择其他:单选按钮
14.单击工作区
15.选择MyProject(而不是MyProjectTest,其他编辑框里面的值应该是$ {workspace_loc:MyProject})
16.单击“确定”
17.单击关闭。
现在运行新的运行配置。实施例3-3是样品的机电单元测试。
问题
你喜欢单元测试,但Android的原始测试框架是基于古老的Android 3.8,它运行在模拟器,所以它的速度很慢。
解
使用Robolectric,JUnit 4测试跑者是快。
讨论
这些说明是为Eclipse设置的。
假设您的“主”项目设置为正常的Android项目,在此项目中创建一个名为例如“test”的文件夹(不要将其标记为源文件夹),然后执行以下操作:
1.使用新建项目向导创建一个单独的项目(不使用Android测试项目向导)
2.使此项目依赖于您的主项目(构建路径→配置)
3.从新项目的构建路径中删除默认源文件夹src
4.仍然在构建路径中,单击链接其他源;浏览并选择| / MainProject / test
5.将Robolectric-3.1.jar添加到新项目的类路径,通过将其复制到libs /或通过在构建脚本(Maven或Gradle)中指定它。
6.通过从“新建类→JUnit测试”向导中选择JUnit 4,将JUnit 4(而不是3.8!)添加到新项目的类路径中。
7.注释您的JUnit 4测试以使用RoboLectrict测试运行器(示例如下)
8.在需要时使用Robolectric“阴影”类
接下来,创建一个具有以下特殊属性的Eclipse运行配置(此部分引自RoboLectric网站):
1.运行→运行配置
2.双击JUnit(不是Android JUnit测试)
名称:MyProjectTestConfiguration
4.选择在所选项目,包或源文件夹中运行所有测试:单选按钮
5.单击搜索按钮
6.选择MyProjectTest
7. TestRunner:JUnit 4
8.单击链接多个启动器可用选择一个在对话框的底部
9.选中使用配置特定设置框
10.选择Eclipse JUnit Launcher
11.单击“确定”
12.单击“参数”选项卡
13.在工作目录下:选择其他:单选按钮
14.单击工作区
15.选择MyProject(而不是MyProjectTest,其他编辑框里面的值应该是$ {workspace_loc:MyProject})
16.单击“确定”
17.单击关闭。
现在运行新的运行配置。实施例3-3是样品的机电单元测试。
实例3-3。机械测试
@RunWith(RobolectricTestRunner.class)
public class HistoryActivityTest {
private HistoryActivity activity;
private Button listButton;
@Before
public void setup() {
activity = new HistoryActivity();
activity.onCreate(null);
listButton = (Button) activity.findViewById(R.id.listButton);
}
@Test
public void didWeGetTheRightButton() {
assertEquals("History Log (Morning)", (String) listButton.getText());
}
@Test
public void listButtonShouldLaunchListActivity() throws InterruptedException {
assertNotNull(listButton);
boolean clicked = listButton.performClick();
assertTrue("performClick", clicked);
ShadowActivity shadowActivity = Robolectric.shadowOf(activity);
Intent startedIntent = shadowActivity.getNextStartedActivity();
assertNotNull("shadowActivity.getNextStartedActivity == null?", startedIntent);
ShadowIntent shadowIntent = Robolectric.shadowOf(startedIntent);
assertEquals(WeightListActivity.class.getName(), shadowIntent.getComponent().getClassName());
}
}