aNdroid.text.textutils中未嘲笑的错误"” iSempty.使用powermockito.s



我在我的Android应用中使用Mockito和PowerMock进行本地单元测试:

testImplementation 'org.mockito:mockito-core:2.8.9'
String powerMockVersion = "1.7.3"
testImplementation "org.powermock:powermock-module-junit4:${powerMockVersion}"
testImplementation "org.powermock:powermock-api-mockito2:${powerMockVersion}"

这是我的代码:

mytextutils.java

package sample.com.sample_app;
import android.support.annotation.Nullable;
import android.text.TextUtils;
public class MyTextUtils {
    private MyTextUtils() {
        throw new AssertionError();
    }
    public static boolean isEmpty(@Nullable final CharSequence cs) {
        return TextUtils.isEmpty(cs);
    }
}

systemutils.java

package sample.com.sample_app;
import java.util.Random;
public class SystemUtils {
    private SystemUtils() {
        throw new AssertionError();
    }
    public static long currentTimeMillis() {
        return System.currentTimeMillis();
    }
    public static long nextLong() {
        return new Random().nextLong();
    }
}

和我的测试。

footest.java

package sample.com.sample_app;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertEquals;
@RunWith(PowerMockRunner.class)
@PrepareForTest(SystemUtils.class)
public class FooTest {
    @Before
    public void setUp() {
        PowerMockito.spy(SystemUtils.class);
        PowerMockito.when(SystemUtils.currentTimeMillis()).thenReturn(1_000L);
    }
    @Test
    public void foo() {
        assertEquals(1_000L, SystemUtils.currentTimeMillis());
    }
}

loremipsumtest.java

package sample.com.sample_app;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertTrue;
@RunWith(PowerMockRunner.class)
@PrepareForTest(MyTextUtils.class)
public class LoremIpsumTest {
    @Before
    public void setUp() {
        PowerMockito.spy(MyTextUtils.class);
        PowerMockito.when(MyTextUtils.isEmpty("")).thenReturn(true);
    }
    @Test
    public void lorem() {
        assertTrue(MyTextUtils.isEmpty(""));
    }
}

当我运行LoremIpsumTest时,它会出现以下错误:

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

如果我用PowerMockito.mockStatic(MyTextUtils.class);替换PowerMockito.spy(MyTextUtils.class);,则LoremIpsumTest工作。

另一方面,FooTestPowerMockito.spy(SystemUtils.class);一起使用。LoremIpsumTest中的部分模拟事物怎么了?

http://tools.android.com/tech-docs/unit-testing-support#toc-method-...-not-mocked.-

"我们知道在使用日志或文本类似的类时,默认行为是有问题的,并且会在将来发行中评估可能的解决方案。"

https://medium.com/@okmanideep/dont-create-that-that-to-to-nit-to-unit-test-test-your-android-class-8ab32af34e84

最新更新