java - 如何防止 Mockito 动态地 mock ......?

标签 java junit mockito

这是此 one 的后续问题.

我的问题是:我将我们的环境升级到更新版本的 JUnit、Mockito ......不幸的是,我正在使用最新的 IBM JRE 运行我的本地测试。然后我们发现在我们的构建环境中,我们所有的 Mockito 测试现在都失败了

org.mockito.exceptions.base.MockitoException:

Mockito cannot mock this class: interface java.util.concurrent.ExecutorService.

Mockito can only mock non-private & non-final classes. If you're not sure why you're getting this error, please report to the mailing list.

其次是:

已知早期 IBM 虚拟机与 Mockito 存在问题,请升级到最新版本。

好的;所以我花了一些时间来 A) 在测试中计算出它是由过时的 JRE 运行的,这样我就可以 B) 然后跳过所有测试。到底;我整理了以下代码。

但有一些预先说明:我验证我的forceJUnit...() 方法真的在使用 IBM Java8 运行时会抛出该异常具有 SR1 或 SR2 级别的 JRE。我的观点是:虽然该方法应该抛出...当我运行该测试用例时,我仍然遇到关于“无法模拟”的 Mockito 异常!

知道我在这里做错了什么吗?

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;

class Helper {
    public static void forceJUnitToIgnoreTestForJava8SR1() {
        Assume.assumeFalse("Ignoring test when running with JRE SR1", isJava8SR1());
    }

    private static boolean isJava8SR1() {
        String fullVersion = System.getProperty("java.fullversion", "");
        return fullVersion.contains("R28_Java8_SR1");
    }
}

@RunWith(MockitoJUnitRunner.class)
public class Mcve {

    @Mock
    private ExecutorService service;

    @Before
    public void setup() {
        Helper.forceJUnitToIgnoreTestForJava8SR1();

        // make the mcve do something
        doAnswer(new Answer<Future<?>>() {
            @Override
            public Future<?> answer(InvocationOnMock invocation) throws Throwable {
                return null;
            }
        }).when(service).submit(any(Runnable.class));
    }

    @Test
    public void test() {
        System.out.println("won't show up ;-(");
    }
}

最佳答案

直接调用 MockitoAnnotations.initMocks(this) 而不是使用 MockitoJUnitRunner:

public class Mcve {

    @Mock
    private ExecutorService service;

    @Before
    public void setup() {
        Helper.forceJUnitToIgnoreTestForJava8SR1();
        MockitoAnnotations.initMocks(this);
        ...
    }

    @Test
    public void test() {
        System.out.println("won't show up ;-(");
    }
}

关于java - 如何防止 Mockito 动态地 mock ......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41766475/

相关文章:

java - 为什么使用工厂而不是 'new' ?

java - org.hamcrest.io.FileMatchers 是否包含在任何 hamcrest 构建中?

java - Mockito 验证单元测试 - 需要但未调用。事实上,与这个模拟的互动为零

c++ - 改变 gmock 期望

java - 替代嵌套 FOR 循环

java - 其他语言的 Cucumber lambda

java - 无法实例化 Duration 类型 - Joda Java

java - 带有 Hibernate 4 的 Spring 3——单元测试失败,没有找到当前线程的 session

java - 如何在 GWT 中测试生成器?

android - 模拟返回 Kotlin Coroutines Deferred 类型的方法的返回值