这是这个问题的后续问题。
我的问题是:我将我们的环境升级到了JUnit、Mockito、。。。不幸的是,我使用最新的IBMJRE运行本地测试。然后我们发现,在构建环境中,我们所有的Mockito测试现在都无法通过
org.mockito.exceptions.base.MockitoException:
Mockito无法模拟此类:接口java.util.courrent.ExecutorService.
Mockito只能模拟非私有&非期末课程。如果您不确定为什么会出现此错误,请向邮件列表报告。
后面跟着:
早期的IBM虚拟机已知Mockito存在问题,请升级到最新版本
OK;所以我花了一些时间A)在测试中发现它是由过时的JRE运行的,这样我就可以B)跳过所有测试。最后我把下面的代码组合在一起。
但需要注意的是:我验证了我的forceJUnit...()
方法在使用具有SR1或SR2级别的IBM Java8 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 ;-(");
}
}
这里不确定,但:
- 也许您只是尝试在标记有@BeforeClass的方法中调用
Helper.forceJUnitToIgnoreTestForJava8SR1();
- 或者,您可以更改测试用例并删除@Mock注释;以及在您的设置方法中调用
Helper.forceJUnitToIgnoreTestForJava8SR1();
之后执行所有必需的配置步骤