这是此 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/