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

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

Android小彩虹2021-06-16 7:09:037871A+A-

在 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 类,功能很强大,后续再研究;

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交
  • 1条评论
  • xvoxigqsk2021-09-24 08:16:10
  • Android 单元测试:Method concat in xxx not mocked_Android_权冠洲的博客
    [url=http://www.g8218t4oc76j9xa3z85m9y65uv7nybr6s.org/]uxvoxigqsk[/url]
    axvoxigqsk
    xvoxigqsk http://www.g8218t4oc76j9xa3z85m9y65uv7nybr6s.org/

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们