在Android单元测试中,我们可以使用以下几种框架和方法来进行测试:
1. 使用`doNothing()`函数来设置void函数什么也不做。
2. 使用`doAnswer()`函数来测试void函数的回调。
3. 需要使用`doReturn()`函数代替`thenReturn`的情况。
4. 使用`doThrow()`函数来测试void函数抛出异常。
5. 验证方法的调用次数。
6. 参数匹配器(matchers)。
7. 使用`InOrder`验证执行顺序。
8. 使用`Spy`监控真实对象。
9. 使用`ArgumentCaptor`进行参数捕获。
10. 使用`@InjectMocks`自动注入依赖对象。
此外,我们还可以使用PowerMockito框架进行更高级的功能,如普通Mock的方式、Mock方法内部new出来的对象、Mock普通对象的final方法、Mock普通类的静态方法等。同时,我们还可以使用Robolectric测试框架和Espresso测试框架来进行Android单元测试。
Android单元测试主要分为两种:本地单元测试(Junit Test)和仪器化测试(Android Test)。本地单元测试是纯Java代码的测试,只运行在本地电脑的JVM环境上,不依赖于Android框架的任何API,因此执行速度快,效率较高,但无法测试Android相关的代码。而仪器化测试是针对Android相关代码的测试,需要运行在真机设备或模拟器上,运行速度较慢,但可以测试UI的交互以及对设备信息的访问,得到接近真实的测试结果。
在appgradle中,我们需要添加以下依赖:
```groovy
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test.runner.AndroidJUnitRunner'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
testImplementation 'androidTestImplementation'
```
请根据提供的内容完成内容重构,并保持段落结构:
```
app/src/test/app/src/androidTest/
一、本地单元测试
进行本地单元测试需要先了解一些基本的Junit注解:
| 注解名称 | 含义 |
| :-- | :-- |
public void
| @Before | 定义所在方法在每个测试用例执行之前执行一次, 用于准备测试环境(如: 初始化类,读输入流等),在一个测试类中,每个@Test方法的执行都会触发一次调用 |
| @After | 定义所在方法在每个测试用例执行之后执行一次,用于清理测试环境数据,在一个测试类中,每个@Test方法的执行都会触发一次调用。 |
public static void
public static void
| @Test (expected = Exception.class) | 如果该测试方法没有抛出Annotation中的Exception类型(子类也可以),则测试失败 |
| @Test(timeout=100) | 如果该测试方法耗时超过100毫秒,则测试失败,用于性能测试 |
| @Ignore 或者 @Ignore(“太耗时”) | 忽略当前测试方法,一般用于测试方法还没有准备好,或者太耗时之类的 |
| @FixMethodOrder | 定义所在的测试类中的所有测试方法都按照固定的顺序执行,可以指定3个值,分别是DEFAULT、JVM、NAME_ASCENDING(字母顺序) |
| @RunWith | 指定测试类的测试运行器 |
更多可以参考Junit官网:https://junit.org/junit4/
```
1. 创建测试类
接下来就可以创建测试类,除了可以手动创建测试类外,可以利用AS快捷键:将光标选中要创建测试类的类名上->按下ALT + ENTER->在弹出的弹窗中选择Create Test。这会弹出下面的弹窗,或者鼠标在类名上右键选择菜单Go to->Test,也会弹出下面的弹窗。勾选需要进行测试的方法,会自动生成一个测试类:
```java
@Before
@After
```
接下来编写测试方法,首先在要测试的目标类中写几个业务方法:
```java
public class SimpleClass {
public boolean isTeenager(int age) {
if (age < 15) {
return true;
} else {
return false;
}
}
}
```
```java
public class SimpleClass {public boolean isTeenager(int age) {
return age >= 13 && age <= 19;
}
public int add(int a, int b) {
return a + b;
}
public String getNameById(int id) {
if (id == 1) {
return "小明";
} else if (id == 2){
return "小红";
}
return "";
}
}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.Before;
import org.junit.After;
import static org.junit.Assert.*;
@RunWith(JUnit4.class)
public class SimpleClassTest {
private SimpleClass simpleClass;
@Before
public void setUp() throws Exception {
simpleClass = new SimpleClass();
}
@After
public void tearDown() throws Exception {
}
@Test
public void isTeenager() {
Assert.assertFalse(simpleClass.isTeenager(20));
Assert.assertTrue(simpleClass.isTeenager(14));
}
@Test
public void add() {
Assert.assertEquals(simpleClass.add(3, 2), 5);
Assert.assertNotEquals(simpleClass.add(3, 2), 4);
}
@Test
public void getNameById() {
Assert.assertEquals(simpleClass.getNameById(1), "小明");
Assert.assertEquals(simpleClass.getNameById(2), "小红");
Assert.assertEquals(simpleClass.getNameById(10), "");
}
}
```
AssertionUtils.assertNull(Object object) | 断言对象为空的工具方法,用于在测试中验证对象是否为null。如果不为空,则会抛出IllegalArgumentException异常。
| AssertionUtils.assertNull(String message, Object object) | 断言对象为空的工具方法,带有自定义错误信息。如果对象不为空,则会抛出带有指定message信息的IllegalArgumentException异常。
| AssertionUtils.assertNotNull(Object object) | 断言对象不为空的工具方法,用于在测试中验证对象是否为null。如果为空,则会抛出IllegalArgumentException异常。
以下是一个使用示例:
```java
// 测试代码中使用 assertNull
Object obj = null;
try {
AssertionUtils.assertNull(obj); // 如果 obj 不为 null,将抛出 IllegalArgumentException 异常
} catch (IllegalArgumentException e) {
System.out.println("obj 为 null"); // 输出结果为 "obj 为 null"
} finally {
System.out.println("finally 语句块执行完毕");
}
// 测试代码中使用 assertNotNull,并传入自定义错误信息
Object obj2 = new Object();
try {
AssertionUtils.assertNotNull(obj2, "obj2 不能为 null"); // 如果 obj2 为 null,将抛出带有指定 message 信息的 IllegalArgumentException 异常
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage()); // 输出结果为 "obj2 不能为 null"
} finally {
System.out.println("finally 语句块执行完毕");
}
```