Android 单元测试:Method concat in xxx not mocked

在 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
喜欢就支持一下吧
点赞0 分享