我正在使用easymock + powermock编写测试,因此使用powermock的原因是模拟静态方法。
我的测试课看起来像:
import static org.powermock.api.easymock.PowerMock.mockStatic;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticTest.class)
public class DummyTest {
@Test
public void testDummy() {
mockStatic(StaticTest.class);
Mockito.when(StaticTest.testMethod()).thenReturn("hello world");
........
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试依赖项和版本:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>1.4.12</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
运行测试,我得到了初始化错误,如下所示:
java.lang.NoClassDefFoundError: net/sf/cglib/proxy/Enhancer
at org.powermock.api.extension.proxyframework.ProxyFrameworkImpl.isProxy(ProxyFrameworkImpl.java:29)
at org.powermock.reflect.internal.WhiteboxImpl.getUnmockedType(WhiteboxImpl.java:1783)
at org.powermock.reflect.internal.WhiteboxImpl.getType(WhiteboxImpl.java:2237)
at org.powermock.reflect.internal.WhiteboxImpl.setInternalState(WhiteboxImpl.java:327)
at org.powermock.reflect.proxyframework.RegisterProxyFramework.registerProxyFramework(RegisterProxyFramework.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 android 常量类,如下所示:
public class Consts extends BaseConstants {
public static final String SCHEME = "http";
// Tag used to cancel the request
public static final String TAG_JSON = "json_obj_req";
}
Run Code Online (Sandbox Code Playgroud)
其中没有其他内容,因此应该很容易模拟。我在我的测试用例中调用它:
Mockito.spy(Consts.class); ...这是失败的。以下是测试用例文件:
public class ApplicationTest extends ActivityInstrumentationTestCase2<MainActivity> {
MainActivity mActivity;
public ApplicationTest() {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
setActivityInitialTouchMode(false);
mActivity = getActivity();
}
public void testUrlValid() {
Mockito.spy(Consts.class);
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试用例的 logcat 输出:
Running tests
Test running started
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class java.lang.Class …Run Code Online (Sandbox Code Playgroud)