模拟静态方法在较新的 mockito-core 版本中不起作用
Mocking static method doesn't work in newer mockito-core version
我在更改 mockito-core
版本时遇到奇怪的错误。我的代码:
import org.junit.After;
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 org.powermock.reflect.Whitebox;
import static org.mockito.Mockito.validateMockitoUsage;
import static org.powermock.api.mockito.PowerMockito.doNothing;
import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
@RunWith(PowerMockRunner.class)
@PrepareForTest(value = App.class)
public class TestClass {
@Before
public void setup() {
mockStatic(App.class);
when(App.getInstance()).thenReturn(mock(App.class));
}
// tests
}
模拟 App.getInstance()
在我使用
时工作正常
testImplementation group:'org.mockito',name:'mockito-core',version:'2.23.0'
但将其更改为最新版本
testImplementation group: 'org.mockito', name: 'mockito-core', version: '2.28.2'
给我错误
org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class java.lang.Class
在线when(App.getInstance()).thenReturn(mock(App.class));
我的 build.gradle mockito 部分:
testImplementation group: 'org.mockito', name: 'mockito-core', version: '2.28.2'
testImplementation group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2'
testImplementation group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.2'
任何人都可以提供任何想法,为什么更改 mockito-core
会导致此问题?
Could anyone provide any ideas why changing mockito-core is causing this issue?
当然:PowerMock(ito) 不仅仅适用于任何 版本的 Mockito。
查看他们的 documentation:
Mockito PowerMock
2.8.9+ 2.x
看到那个。 2.8.something。不是 2.28.something
你很幸运 2.23 可以工作,因为那个版本也不不支持。
购买 PowerMock 依赖项时要非常谨慎的另一个很好的理由是:它会显着降低您使用新版本 Mockito 的能力。
因此,我个人的两分钱:PowerMock(ito) 的唯一合理用例是当您拥有无法通过其他方式测试的遗留代码时。对于 任何 其他项目,尤其是在编写您自己的新代码时:只需使用独立的 Mockito。而不是使用 PowerMock 锤子来测试 hard-to-test 代码,而是花一些时间学习如何编写 easy-to-test 代码。
长话短说:使用 PowerMock 时,最好坚持使用获得 Team PowerMock "official" 批准的 Mockito 版本。
如果你不喜欢被这样的限制,我想我已经告诉你如何摆脱它了。
我在更改 mockito-core
版本时遇到奇怪的错误。我的代码:
import org.junit.After;
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 org.powermock.reflect.Whitebox;
import static org.mockito.Mockito.validateMockitoUsage;
import static org.powermock.api.mockito.PowerMockito.doNothing;
import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
@RunWith(PowerMockRunner.class)
@PrepareForTest(value = App.class)
public class TestClass {
@Before
public void setup() {
mockStatic(App.class);
when(App.getInstance()).thenReturn(mock(App.class));
}
// tests
}
模拟 App.getInstance()
在我使用
testImplementation group:'org.mockito',name:'mockito-core',version:'2.23.0'
但将其更改为最新版本
testImplementation group: 'org.mockito', name: 'mockito-core', version: '2.28.2'
给我错误
org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class java.lang.Class
在线when(App.getInstance()).thenReturn(mock(App.class));
我的 build.gradle mockito 部分:
testImplementation group: 'org.mockito', name: 'mockito-core', version: '2.28.2'
testImplementation group: 'org.powermock', name: 'powermock-module-junit4', version: '2.0.2'
testImplementation group: 'org.powermock', name: 'powermock-api-mockito2', version: '2.0.2'
任何人都可以提供任何想法,为什么更改 mockito-core
会导致此问题?
Could anyone provide any ideas why changing mockito-core is causing this issue?
当然:PowerMock(ito) 不仅仅适用于任何 版本的 Mockito。
查看他们的 documentation:
Mockito PowerMock
2.8.9+ 2.x
看到那个。 2.8.something。不是 2.28.something
你很幸运 2.23 可以工作,因为那个版本也不不支持。
购买 PowerMock 依赖项时要非常谨慎的另一个很好的理由是:它会显着降低您使用新版本 Mockito 的能力。
因此,我个人的两分钱:PowerMock(ito) 的唯一合理用例是当您拥有无法通过其他方式测试的遗留代码时。对于 任何 其他项目,尤其是在编写您自己的新代码时:只需使用独立的 Mockito。而不是使用 PowerMock 锤子来测试 hard-to-test 代码,而是花一些时间学习如何编写 easy-to-test 代码。
长话短说:使用 PowerMock 时,最好坚持使用获得 Team PowerMock "official" 批准的 Mockito 版本。
如果你不喜欢被这样的限制,我想我已经告诉你如何摆脱它了。