Java 如何防止嘲笑。。。动态的?
这是这个问题的后续问题 我的问题是:我将我们的环境升级到了JUnit、Mockito等较新版本。。。不幸的是,我使用最新的IBMJRE运行本地测试。然后我们发现在我们的构建环境中,我们所有的Mockito测试现在都失败了 org.mockito.exceptions.base.MockitoException: Mockito无法模拟此类:接口java.util.concurrent.ExecutorService Mockito只能模拟非私有和非最终类。 如果您不确定为什么会出现此错误,请向邮件列表报告 其次是: 已知早期IBM虚拟机存在Mockito问题,请升级到最新版本。 嗯,;所以我花了一些时间A)在一个测试中找出它是由过时的JRE运行的,这样我就可以B)然后跳过所有的测试。最后我把下面的代码放在一起 但一些注意事项是:我验证了Java 如何防止嘲笑。。。动态的?,java,junit,mockito,Java,Junit,Mockito,这是这个问题的后续问题 我的问题是:我将我们的环境升级到了JUnit、Mockito等较新版本。。。不幸的是,我使用最新的IBMJRE运行本地测试。然后我们发现在我们的构建环境中,我们所有的Mockito测试现在都失败了 org.mockito.exceptions.base.MockitoException: Mockito无法模拟此类:接口java.util.concurrent.ExecutorService Mockito只能模拟非私有和非最终类。 如果您不确定为什么会出现此错误,请向邮
forceJUnit…()
方法在使用具有SR1或SR2级别的IBM Java8 JRE运行时确实会引发该异常。我的观点是:虽然方法应该抛出。。。当我运行那个测试用例时,我仍然遇到关于“cannotmock”的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 ;-(");
}
}
import static org.mockito.ArgumentMatchers.any;
导入静态org.mockito.mockito.doAnswer;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Future;
导入org.junit.aspect;
导入org.junit.Before;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.mockito.Mock;
导入org.mockito.invocation.invocationMock;
导入org.mockito.junit.MockitoJUnitRunner;
导入org.mockito.stubing.Answer;
类助手{
public static void forcejunitotignoretestforjava8sr1(){
assumeFalse(“使用JRE SR1运行时忽略测试”,isJava8SR1());
}
私有静态布尔值isJava8SR1(){
字符串fullVersion=System.getProperty(“java.fullVersion”,”);
返回fullVersion.contains(“R28_Java8_SR1”);
}
}
@RunWith(MockitoJUnitRunner.class)
公共级Mcve{
@嘲弄
私人遗嘱执行人服务;
@以前
公共作废设置(){
forcejunitotignoretestforjava8sr1();
//让mcve做点什么
doAnswer(新答案-答案(InvocationMock调用)抛出可丢弃{
返回null;
}
}).when(service).submit(any(Runnable.class));
}
@试验
公开无效测试(){
System.out.println(“不会显示;-(”);
}
}
此处不确定,但:
- 也许您只是尝试在标记为@BeforeClass的方法中调用
Helper.forcejunitotignoretestforjava8sr1();
- 或者,您可以更改测试用例并删除@Mock注释;在您的安装方法中调用
之后,执行所有必需的配置步骤Helper.forceJUnitToIgnoreTestForJava8SR1();
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效果很好(另一个选项不是一个选项;因为我没有一个mcve,但是有50多个非常复杂的测试用例有这个问题)!很好,也可以!但这会迫使我在测试用例中更新两个不同的位置;而另一个选项只需要插入一些内容。此外,我已经完成了所有所需更新的一半;但仍然:+1。