在 Android 新建的默认项目中包含了两个测试包,分别为:
- src/androidTest(需要真实的 Android 运行环境,即需要安装启动 App)
- src/test (直接在 JVM 运行)
但是如果我们的被测试测试的方法只包含了很少部分的 Android 相关的类,比如 android.text.TextUtils
,这个时候不想编译运行 app 来测试的,如果不添加其他的依赖的话,就会出现如下错误(Method concat in android.text.TextUtils not mocked
):
java.lang.RuntimeException: Method concat in android.text.TextUtils not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.text.TextUtils.concat(TextUtils.java)
at com.example.androidunittest.TextUtilsTest.test(TextUtilsTest.java:13)
at com.example.androidunittest.ExampleUnitTest.url_isCorrect(ExampleUnitTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
....
复制代码
经过一番 google 发现如下解决方法:
添加两个依赖
dependencies {
testImplementation "org.robolectric:robolectric:4.4"
testImplementation 'androidx.test.ext:junit:1.1.2'
}
复制代码
注意不是使用 androidTestImplementation
而是 testImplementation
,
然后添加 @RunWith(AndroidJUnit4.class)
注解,运行一下测试通过了;完整代码如下:
package com.example.androidunittest;
import android.net.Uri;
import android.text.TextUtils;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleUnitTest {
@Test
public void url_isCorrect() {
String test = TextUtilsTest.test();
boolean isEmpty = TextUtilsTest.isEmpty("");
Uri uri = Uri.parse("https://stackoverflow.com/questions/53595837/ttt.png");
String segment = uri.getLastPathSegment();
System.out.println("segment: " + segment);
assertFalse("segment: " + segment, TextUtils.isEmpty(segment));
assertTrue("isEmpty: ", isEmpty);
assertTrue("true: " + test, test.startsWith("ss"));
}
}
复制代码
package com.example.androidunittest;
import android.text.TextUtils;
/**
* Author: meyu
* Date: 4/21/21
* Email: 627655140@qq.com
*/
public class TextUtilsTest {
public static String test() {
return TextUtils.concat("ss", "null").toString();
}
public static boolean isEmpty(String s) {
return TextUtils.isEmpty(s);
}
}
复制代码
在 JVM 上可以运行 Android 相关的类,主要是 robolectric
模拟了 Android 相关的类,同时还有很多 view 相关的 shadow 类,功能很强大,后续再研究;
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END