如果我做一个像
这样的简单测试用例@Test
public void myTest() throws Exception {
Spanned word = new SpannedString("Bird");
int length = word.length();
}
抛出异常
java.lang.RuntimeException:方法长度 android.text.SpannableStringInternal没有嘲笑。看到 http://g.co/androidstudio/not-mocked了解详情。
这在上面的链接中解释为
用于运行单元测试的android.jar文件不包含 任何实际代码 - 由真实的Android系统映像提供 设备。相反,所有方法都抛出异常(默认情况下)。这是 确保您的单元测试仅测试您的代码而不依赖于 Android平台的任何特定行为(您没有 明确嘲笑,例如使用Mockito)。
那么你如何在Android项目中设置Mockito以模拟这样的类?
我想学习,所以我将在Q& A风格下添加我的答案。
答案 0 :(得分:8)
在您的项目中设置Mockito并不困难。步骤如下。
假设您使用的是jcenter存储库(Android Studio中的默认存储库),请将以下行添加到应用 build.gradle 文件的dependencies
块中:
testCompile "org.mockito:mockito-core:2.8.47"
您可以将版本号更新为most recent Mockito version的任何内容。
看起来应该是这样的:
dependencies {
// ...
testCompile 'junit:junit:4.12'
testCompile "org.mockito:mockito-core:2.8.47"
}
通过导入静态类,您可以使代码更具可读性(即,不是调用Mockito.mock()
,而是使用mock()
)。
import static org.mockito.Mockito.*;
你需要做三件事来模拟对象。
mock(TheClassName.class)
创建类的模拟。when
和thenReturn
执行此操作。 这是一个例子。一个真正的测试可能会使用模拟值作为正在测试的任何内容的某种输入。
public class MyTestClass {
@Test
public void myTest() throws Exception {
// 1. create mock
Spanned word = mock(SpannedString.class);
// 2. tell the mock how to behave
when(word.length()).thenReturn(4);
// 3. use the mock
assertEquals(4, word.length());
}
}
Mockito还有很多其他内容。请参阅以下资源以继续学习。
学习模拟是很好的,因为它很快并隔离了被测试的代码。但是,如果您正在测试一些使用Android API的代码,则可能更容易使用检测测试而不是单元测试。请参阅this answer。