模拟静态方法在较新的模仿核心版本中不起作用

时间:2019-06-07 14:54:12

标签: java static mockito powermock

我在更改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模拟部分:

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会导致此问题?

1 个答案:

答案 0 :(得分:3)

  

任何人都可以提供任何想法,为什么更改模仿内核导致此问题?

当然:PowerMock(ito)不仅可以与任何版本的Mockito一起使用。

查看他们的documentation

Mockito PowerMock
2.8.9+  2.x

看到。 2.8。不是2. 28 .something

您很幸运2.23可以正常运行,因为该版本还也不受支持

在购买PowerMock依赖项时要非常谨慎的另一个很好的理由:这大大降低了您使用较新版本的Mockito的能力。

因此,我个人两分钱:PowerMock(ito)的唯一合理用例是,当您拥有无法通过其他方式测试的旧版代码时。对于其他任何项目,尤其是在编写自己的新代码时:只需使用独立的Mockito。不要花一些时间来学习如何编写易于测试的代码,而不是使用PowerMock锤来测试难以测试的代码。

长话短说:使用PowerMock时,最好坚持使用PowerMock团队“官方”批准的Mockito版本。

如果您不希望受到这样的限制,我想我告诉过您如何摆脱限制。