Android 单元测试(junit、mockito、robolectric)
1、运用JUnit4 进行单元测试
首先在工程的 src
文件夹内创建 test
和 test/java
文件夹。
打开工程的 build.gradle(Module:app)
文件,添加JUnit4依赖,点击Gradle sync按钮。
build.gradle
dependencies {
testCompile 'junit:junit:4.12'
}
(1)新建被测类:
public class Calculator { public double sum(double a, double b){
// 假设先返回结果0
return 0;
}
}
(2)新建测试类:
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class CalculatorTest { private Calculator mCalculator; @Before
public void setUp() throws Exception {
mCalculator = new Calculator();
} @Test
public void testSum() throws Exception {
//断言:1+1 = 2
assertEquals(mCalculator.sum(1d, 1d), 2d);
}
}
这时候 右键 - testSum()方法,选择选择Run > testRun , 也可以通过命令行运行测试,在工程目录内输入:
./gradlew test
这时测试因为我写被测类的时候,返回的是0,所以跟期望的值不一样,就会失败。
这时,我们修改下Calculator.java的函数:
public double sum(double a, double b){
return a + b;
}
保存,这时候再运行测试,成功,跟期望值一样。
总结:位于src/tests
目录下的测试是运行在本地电脑Java虚拟机上的单元测试。
编写测试,实现功能使测试通过,然后再添加更多的测试,这种工作方式使快速迭代成为可能,我们称之为测试驱动开发。
2、使用Mockito等mocking框架来mock测试。
Mock:
mock对象就是在调试期间用来作为真实对象的替代品。
mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。
打开工程的 build.gradle(Module:app)
文件,添加Mockito依赖,点击Gradle sync按钮。
build.gradle
dependencies {
// 单元测试
testCompile 'org.mockito:mockito-all:2.0.2-beta'
testCompile 'junit:junit:4.12'
}
关于mokito的使用,官网已经给出很详细了。我这里主要想记录下主要用到的。对于mvp架构下,测试presenter返回到view的数据,是否正确。
配合mvp模式下,利用本地json,模仿网络请求,进行模拟数据,查看presenter 处理逻辑是否正确。
public class PresenterTest { @Mock
Repository repository; // 网络请求
@Mock
View view; // view PresenterImpl presenter; @Before
public void setUp() throws Exception {
// 如果有使用到rxjava,可以在这里处理rxjava变成同步执行
MockitoAnnotations.initMocks(this); presenter = new PresenterImpl(view, repository);
} @Test
public void getOrderList() throws Exception{
String json = readAssetsJSON("get_list.json").optString("data");
List<ViewModel> list = JSON.parseArray(json, ViewModel.class); when(repository.getList(1)).thenReturn(Observable.just(list));
presenter.getList(1); ArgumentCaptor<ArrayList> captor = ArgumentCaptor.forClass(ArrayList.class);
verify(presenter.getView()).onGetDataByFinish(captor.capture()); List<ViewModel> viewModels = captor.getValue(); assertEquals(list.size(), viewModels.size());
}
}
get_list.json 是放到 src/test下的assets 目录下,这个目录在:打开工程的 build.gradle(Module:app)
文件,android节点下的sourceSets节点下,配置下:
sourceSets {
main {
.....
} test {
java.srcDirs = [ 'src/test/java']
}
}
其他的用法:参考下官方就行,因为官网是英文的,看不懂的,还可以前往:Mockito 中文文档
3、使用Robolectric
Robolectric 是一个针对于Android SDK 的单元测试框架,使用它可以测试驱动你的Android应用程序的开发。测试用例只需要在JVM基础上就能运行起来。
打开工程的 build.gradle(Module:app)
文件,添加Robolectric依赖,点击Gradle sync按钮。
build.gradle
dependencies {
// 单元测试
testCompile 'org.robolectric:robolectric:3.1-rc1'
testCompile 'org.mockito:mockito-all:2.0.2-beta'
testCompile 'junit:junit:4.12'
}
1、创建一个WelcomeActivity, 点击登录,跳转到登录页面。
布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_login"
android:text="click the btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Activity:
public class WelcomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_activity);
final View button = findViewById(R.id.btn_login);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getContext(), LoginActivity.class));
}
});
}
}
测试的是:当用户点击登陆按钮后,我们启动了正常的intent。
由于Robolectric只是一个模拟的单元测试框架,LoginActivity并不会真正的启动,但是我们可以检查是否准确的发出了WelcomActivity的intent。
@RunWith(RobolectricTestRunner.class)
public class WelcomeActivityTest {
@Test
public void clickingLogin_shouldStartLoginActivity() {
WelcomeActivity activity = Robolectric.setupActivity(WelcomeActivity.class);
activity.findViewById(R.id.btn_login).performClick();
Intent expectedIntent = new Intent(activity, WelcomeActivity.class);
assertThat(shadowOf(activity).getNextStartedActivity()).isEqualTo(expectedIntent);
}
}
判断点击后textview 文本变化是否正常等:
@RunWith(RobolectricTestRunner.class)
public class WelcomeActivityTest { @Test
public void clickLoginButton() throws Exception {
Activity activity = Robolectric.buildActivity(WelcomeActivity.class).create().get(); Button btn_login = (Button) activity.findViewById(R.id.btn_login);
TextView tv_result = (TextView) activity.findViewById(R.id.tv_result); btn_login.performClick();
String resultsText = tv_result.getText().toString();
assertThat(resultsText, equalTo("Click the login button"));
}
}
对于控制activity的生命周期,Robolectric 2.2版本以后增加了控制activity方法:
Activity activity = Robolectric.buildActivity(WelcomeActivity.class).create().get();
这会创建一个WelcomeActivity,并且已经调用了onCreate()。
(1)检查一些在onCreate()和onResume()之间发生的事件:
ActivityController controller =
Robolectric.buildActivity(WelcomeActivity.class).create().start();
Activity activity = controller.get();
// assert that something hasn't happened
activityController.resume();
(2)完整的生命周期:
Activity activity =
Robolectric.buildActivity(WelcomeActivity.class).create().start().resume().visible().get();
(3)使用intent 来启动activity:
Intent intent = new Intent(Intent.ACTION_VIEW);
Activity activity =
Robolectric.buildActivity(WelcomeActivity.class).withIntent(intent).create().get();
(4)保存状态:
1 Bundle savedInstanceState = new Bundle();
2 savedInstanceState.putExtra("user_age", "18");
3 savedInstanceState.putExtra("user_name", "jay");
4 Activity activity = Robolectric.buildActivity(WelcomeActivity.class).create()
5 .restoreInstanceState(savedInstanceState).get();
Android 单元测试(junit、mockito、robolectric)的更多相关文章
- Android:单元测试Junit的配置
在实际开发中,开发android软件的过程需要不断地进行测试.而使用Junit测试框架,侧是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性.... ...
- Android单元测试Junit (一)
1.在eclips中建立一个Android工程,具体信息如下: 2.配置单元测试环境,打开AndroidManifest.xml,具体代码如下所示: <?xml version="1. ...
- Android 单元测试Junit
- Android单元测试
安卓单元测试总结文章,目测主要会cover以下的主题: 什么是单元测试 为什么要做单元测试 JUnit Mockito Robolectric Dagger2 一个具体的app例子实践 神秘的bonu ...
- Android单元测试: 首先,从是什么开始
Android单元测试: 首先,从是什么开始 http://chriszou.com/2016/04/13/android-unit-testing-start-from-what.html 这是一系 ...
- Android studio下gradle Robolectric单元测试配置
android studio下gradle Robolectric单元测试配置 1.Robolectric Robolectric是一个基于junit之上的单元测试框架.它并不依赖于Android提供 ...
- JUnit + Mockito 单元测试(二)
摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...
- JUnit + Mockito 单元测试(二)(good)
import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...
- 阿里知识储备之二——junit学习以及android单元测试
一,junit框架 http://blog.csdn.net/afeilxc/article/details/6218908 详细见这篇博客 juit目前已经可以和maven项目进行集成和测试,而且貌 ...
随机推荐
- Baseadapter与Simpleadapter之争
作者:andyrat,联系方式:andyrat@qq.com
- PHP之compact()函数
PHP之compact()函数 compact()函数将变量转化为数组: <?php //直接调用函数 $a=1;$b=3;$c=4; var_dump($a,$b,$c); //自定义函数实现 ...
- 负载均衡-基础-一致性哈希算法及java实现
一致性hash算法,参考: http://www.blogjava.net/hello-yun/archive/2012/10/10/389289.html 针对这篇文章,加入了自己的理解,在原有的代 ...
- 汤姆大叔 javascript 系列 第20课 最后的5到javascript题目
博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 原题: 大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4 ...
- HTTP Status 500 - The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application 错误
解决方法链接:http://stackoverflow.com/questions/17709076/http-status-500-the-absolute-uri-http-java-sun-co ...
- Java中关于String类型的10个问题
1. 如何比较两个字符串?用“=”还是equals 简单来说,“==”是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等.只要你想检测俩字符串是不是相等 ...
- U3D学习笔记1: HelloWorld
Unity 版本: 5.3.5.f1 Hello World工程 1.新建工程 HelloWorld U3D可选2D和3D游戏 2.新建C#脚本文件 在project栏的assets目录右键-&g ...
- mysql 5.5 修改字符编码
修改/etc/mysql/my.cnf 配置文件: 最后重启mysql 服务,再查看: 编码已经改好了,可以支持中文字符编码了.
- ping 或者ssh 发生connect: No buffer space available 错误
如果遇到这种情况,一般说明你的本地服务器的arp表缓存太大,而服务器内核设定的回收条数太小,一直被回收造成的. 可以用一下命令扩大arp表可以缓存的记录条数: echo 512 > /proc/ ...
- selenium 3.0 beta2 初体验
经过漫长的等待,终于迎来了selenium 3.0 从selenium 1.0 至今,差不多有十多年的历史.这个月终于迎来了selenium3.0 那么selenium3.0 为我们带来了什么? 看一 ...