我在我的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.spy(MyTextUtils.class);
替换为PowerMockito.mockStatic(MyTextUtils.class);
,则LoremIpsumTest
可以使用。
另一方面,FooTest
适用于PowerMockito.spy(SystemUtils.class);
。 LoremIpsumTest
中的部分嘲弄事情有什么问题?
答案 0 :(得分:0)
http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-
“我们知道,在使用Log或TextUtils等类时,默认行为会出现问题,并会在将来的版本中评估可能的解决方案。”