单元测试(01) 调试过程中遇到 Method isEmpty in android.text.TextUtils not mocked

本文介绍了在单元测试过程中遇到`Method isEmpty in android.text.TextUtils not mocked`异常的原因、解决办法及避免此类问题的分析。通过修改build.gradle文件可改变这种行为,确保单元测试仅测试自己的代码。

异常信息

java.lang.RuntimeException: Method isEmpty in android.text.TextUtils not mocked. See http://g.co/androidstudio/not-mocked for details.

at android.text.TextUtils.isEmpty(TextUtils.java)
at com.example.kotlindemo.ExampleUnitTest.addition_isCorrect(ExampleUnitTest.kt:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRun
Method isEmpty in android.text.TextUtils not mocked. See http://g.co/androidstudio/not-mocked for details. java.lang.RuntimeException: Method isEmpty in android.text.TextUtils not mocked. See http://g.co/androidstudio/not-mocked for details. at android.text.TextUtils.isEmpty(TextUtils.java) at com.huawei.ascf.trace.AscfTrace.getLogMsg(AscfTrace.java:162) at com.huawei.ascf.trace.AscfTrace.d(AscfTrace.java:94) at com.huawei.ascf.core.AppInstanceManager.getInstance(AppInstanceManager.java:96) at com.huawei.ascf.core.AppInstanceManager.get(AppInstanceManager.java:103) at com.huawei.ascf.core.LifecycleManager.triggerAppStatus(LifecycleManager.java:70) at com.huawei.ascf.core.LifecycleManager.onAudioInterruptionBegin(LifecycleManager.java:56) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.powermock.reflect.internal.WhiteboxImpl.performMethodInvocation(WhiteboxImpl.java:1864) at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:825) at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:805) at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466) at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:401) at com.huawei.ascf.core.LifecycleManagerTest.testOnAudioInterruptionBegin(LifecycleManagerTest.java:24) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
最新发布
09-13
Android 单元测试中出现 `Method isEmpty in android.text.TextUtils not mocked` 异常,通常是因为 Android 框架的某些方法在纯 Java 单元测试环境中未被模拟。以下是几种解决该异常的方法: #### 使用 Robolectric Robolectric 是一个用于 Android 单元测试的框架,它模拟了 Android 运行时环境,使得可以在 JVM 上运行 Android 单元测试。 首先,在 `build.gradle` 中添加 Robolectric 依赖: ```groovy testImplementation 'org.robolectric:robolectric:4.8.2' ``` 然后,在测试类上添加 `@RunWith(RobolectricTestRunner.class)` 注解: ```java import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @RunWith(RobolectricTestRunner.class) public class YourTestClass { // 测试方法 } ``` #### 使用 Mockito 或 PowerMockito 进行模拟 可以使用 Mockito 或 PowerMockito 来模拟 `TextUtils.isEmpty` 方法。 若使用 Mockito: ```java import static org.mockito.Mockito.when; import static org.mockito.Mockito.mock; import android.text.TextUtils; import org.junit.Test; public class YourTestClass { @Test public void testMethod() { TextUtils textUtilsMock = mock(TextUtils.class); when(textUtilsMock.isEmpty("test")).thenReturn(false); // 测试逻辑 } } ``` 若使用 PowerMockito 来模拟静态方法: ```java import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.when; import android.text.TextUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(TextUtils.class) public class YourTestClass { @Test public void testMethod() { mockStatic(TextUtils.class); when(TextUtils.isEmpty("test")).thenReturn(false); // 测试逻辑 } } ``` #### 使用 AndroidX Test 框架 AndroidX Test 框架提供了一些工具来处理 Android 单元测试中的模拟问题。可以使用 `Mockito` 和 `AndroidJUnitRunner` 结合进行测试。 在 `build.gradle` 中添加依赖: ```groovy androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'org.mockito:mockito-android:4.1.0' ``` 测试类示例: ```java import androidx.test.ext.junit.runners.AndroidJUnit4; import android.text.TextUtils; import org.junit.Test; import org.junit.runner.RunWith; import static org.mockito.Mockito.when; import static org.mockito.Mockito.mock; @RunWith(AndroidJUnit4.class) public class YourTestClass { @Test public void testMethod() { TextUtils textUtilsMock = mock(TextUtils.class); when(textUtilsMock.isEmpty("test")).thenReturn(false); // 测试逻辑 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值