Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止嘲笑。。。动态的?_Java_Junit_Mockito - Fatal编程技术网

Java 如何防止嘲笑。。。动态的?

Java 如何防止嘲笑。。。动态的?,java,junit,mockito,Java,Junit,Mockito,这是这个问题的后续问题 我的问题是:我将我们的环境升级到了JUnit、Mockito等较新版本。。。不幸的是,我使用最新的IBMJRE运行本地测试。然后我们发现在我们的构建环境中,我们所有的Mockito测试现在都失败了 org.mockito.exceptions.base.MockitoException: Mockito无法模拟此类:接口java.util.concurrent.ExecutorService Mockito只能模拟非私有和非最终类。 如果您不确定为什么会出现此错误,请向邮

这是这个问题的后续问题

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

org.mockito.exceptions.base.MockitoException:

Mockito无法模拟此类:接口java.util.concurrent.ExecutorService

Mockito只能模拟非私有和非最终类。 如果您不确定为什么会出现此错误,请向邮件列表报告

其次是:

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

嗯,;所以我花了一些时间A)在一个测试中找出它是由过时的JRE运行的,这样我就可以B)然后跳过所有的测试。最后我把下面的代码放在一起

但一些注意事项是:我验证了
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。