Android 单元测试01--JUnit测试
来源:互联网 发布:mui.js下载 编辑:程序博客网 时间:2024/05/18 03:02
Android studio提供了简单的测试,你可以测试JUnit(在jvm测试)或者进行仪器测试(真机或者虚拟器),你也可以扩展你的测试能力,比如使用Mockito来测试Android的api在unit tests,或者使用Espresso 或者UI Automator模拟用户操作在仪器测试中。
本文章主要来说JUnit测试。
测试类型
Local unit tests
位于 src/test/java
运行在JVM中,测试没有依赖于Android framework
Instrumentd tests
位于 src/androidTest/java
创建一个测试
local unit test
第一步:创建
java 类
public class User { private String userName; private int userAge; private User() { } public User(String userName, int userAge) { this.userAge = userAge; this.userName = userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserName() { return userName; } public void setUseAge(int userAge) { this.userAge = userAge; } public int getUserAge() { return userAge; } @Override public String toString() { return "User{" + "userName='" + userName + '\'' + ", userAge=" + userAge + '}'; }}
第二步,选择User ctrl+shift+t 创建test,生成目录src/test/java
public class UserTest { private User user; @Before public void setUp() throws Exception { user = new User("Rrtoyewx", 21); } @After public void tearDown() throws Exception { System.out.println(user.toString()); } @Test public void testSetUserName() throws Exception { user.setUserName("xu"); assertTrue(user.getUserName().equals("xu")); } @Test public void testSetUseAge() throws Exception { user.setUseAge(17); assertEquals(17, user.getUserAge(), 0); }}
第三步:运行
- @Before test之前会调用
- @After test之后会调用
- @Test 每个test互不干扰,即test完之后执行下一个test,执行顺序依此为before test1 after before test2 after
- @BeforeClass:只加载一次
- @AfterClass:只加载一次
- Assert类提供较多验证操作,可以使用hamcrest 增加更多的验证运算符
比如下面的三个操作是一样的
assertTrue(user.getUserName().equals("xu")); assertThat(user.getUserName(),is("xu")); assertThat(user.getUserName(),equalTo("xu"));
顺便粘一张hamcrest的操作符
Mockito
@RunWith(MockitoJUnitRunner.class)
学习网站
Mockito Contents
opearator
verify :Once created, a mock will remember all interactions. Then you can selectively verify whatever interactions you are interested in.
stubbing:
when(mock.someMethod).thenReturn()
By default, for all methods that return a value
数据类型 返回值 collection null int/integer 0 boolean/Boolean falseStubbing can be overridde
- Once stubbed, the method will always return a stubbed value, regardless of how many times it is called.
- Last stubbing is more important
Argument matchers
//anyanyInt();anyBoolean();anyXxx();//custome mathcherargThat(customeMathcher);//eqeq()
- if you are using argument matchers, all arguments have to be provided by matchers.
Verifying exact number of invocations
vertify(mock,invocations)//nevernever()//atLeastatLeast()//atMostatMost()//timestimes();
-times(1) is the default;
Stubbing void methods with exceptions
doThrow(Exception e).when(mock).someMethod();when(mock).someMethod().thenThrow(Exception e);
Verification in order
//singlemock.doFirstSomeMethod();InOrder order = inOrder(mock);order.veritfy(mock).doFirstSomeMethod();//multiplemock1.doFirstSomeMethod();mock2.doSecondSomeMethod();InOrder order = inOrder(mock1,mock2);order.veritfy(mock1).doFirstSomeMethod();order.veritfy(mock2).doSecondSomeMethod();
Making sure interaction(s) never happened on mock
//times/invocationsverify(mock,never()).someMethod//never interactionsverifyZeroInteractions(mock...);
Finding redundant invocations
mock.someMethod("1");//mock.someMethod("1")mock.someMethod("2")verify(mock).someMethod("1")vertify(mock).someMethod("2")verifyNoMoreInteractions(mock);
@mock
Stubbing consecutive calls
when(mock.someMethod()).thenReturn(1,2,3,4);mock.someMethod(); // 1mock.someMethod(); // 2mock.someMethod(); // 3mock.someMethod(); // 4mock.someMethod(); // 4mock.someMethod(); // 4
Stubbing with callbacks
public interface Answer<T> { T answer(InvocationOnMock invocation) throws Throwable;}when(mock.someMethod()).thenAnswer(new Answner())
when do void method(),doReturn|doThrow()|doAnswer()|doNothing()|doCallRealMethod
doXxx().when(mock).someMethod(); doReturn() //return value; doThrow() //throw exception; doAnswer() //callBack doNothing() //doNothing doCallRealMethod() // mock 对应的队形mockObject.someMethod() doXxx().doXxx().doXxx().when(mock).someMethod();
Spying on real objects
Object object = new Object();Spy spy = spy(object);spy.add()vertity(spy).add()
- spy named “partial mocking”;
- spy :can throw Exception when studding, Therefore when using spies please consider doReturn|Answer|Throw() family of methods for stubbing
Changing default return values of unstubbed invocations (1.7)
mock = mock(Object.class,Mockito.RETURNS_SMART_NULLS);mock = mock(Object.class ,new CustomerAnsewer());// Mockito.RETURNS_SMART_NULLS :If your code uses the object returned by an unstubbed call you get a NullPointerException. This implementation of Answer returns SmartNull instead of null. SmartNull gives nicer exception message than NPE because it points out the line where unstubbed method was called. // CustomerAnsewer
Capturing arguments for further assertions(1.8)
mock.someMethod(argument);vertify(mock).someMethod(argument);ArgumentCaptor<Argument> argumentCapture = ArgumentCaptor.forClass(Argument.class);vertify(mock).someMethod(argumentCapture.capture());assert();
timeout/reset
总结
一般使用JUnit来测试一些功能性的代码,比如验证等操作,它不能使用Android Api,除非使用Mockito 来mock一些非必要在仪器上才能进行的测试。比如说sharePerference,Sqlite等一些操作。
另外功能测试尽量小,测试的功能越小,越容易定为哪儿出了问题。
0 0
- Android 单元测试01--JUnit测试
- Android测试:单元测试Junit
- android中关于测试和JUnit单元测试
- Android JUnit单元测试周期,异常,测试套件
- Android 中Junit 测试框架(单元测试)
- Android使用Robotium自动化测试junit生成单元测试结果报告
- Android:Junit 单元测试方法
- Android Junit单元测试
- Android Junit单元测试
- android中junit单元测试
- Android 使用Junit单元测试
- Android单元测试Junit
- Android:单元测试Junit配置
- Android单元测试 Junit(1)
- junit实现android单元测试
- android junit单元测试
- android JUnit单元测试
- android JUnit单元测试
- 推理集 —— 实证
- webView 使用指南及使用心得总结
- 使用Lua的扩展库LuaSocket用例
- 链表操作
- 输入法dialog、window
- Android 单元测试01--JUnit测试
- 搜索收录推送
- HTTP协议详解(真的很经典)
- Android使用HttpUrlConnection请求服务器发送数据详解
- WPF的RadioButton若界面重载可能会导致RadioButton不可用
- PLSQL Developer怎么查看一个表的建表语句
- Day2 of 6
- windows系统安装ubuntu后,grub中没有windows启动项
- MYSQL简单操作(eclipse)