当前位置: 首页 > 知识库问答 >
问题:

Mocked ExecutorService始终返回相同的模拟未来

甄云
2023-03-14

我实现了一个模拟ExecutorService来立即返回结果,而无需创建线程:

public static ExecutorService createMock() throws Exception {
    ExecutorService executorServiceMock = EasyMock.createMock(ExecutorService.class);
    Future future = EasyMock.createMock(Future.class);
    Capture<Callable<?>> callableCapture = new Capture<>();
            EasyMock.expect(executorServiceMock.submit(EasyMock.<Callable<?>>capture(callableCapture))).andReturn(future).anyTimes();
    EasyMock.expect(future.get()).andAnswer(() -> callableCapture.getValue().call()).anyTimes();

    executorServiceMock.shutdown();
    EasyMock.expectLastCall().anyTimes();
    EasyMock.replay(future, executorServiceMock);
    return executorServiceMock;
}

问题是它总是返回相同的[mocked]Future对象。我需要根据传递给执行器的可调用对象返回Future mock的新实例ServiceMock.submit()我尝试使用PowerMock.expectNew(Future.class),但它抱怨“在类'java.util.concurrent.Future'中找不到带有参数类型的构造函数:[]”

共有3个答案

艾凌龙
2023-03-14

下面的代码修复了我的问题。

@Mock
private ThreadPoolExecutor executorPool;

Future<String> result = CompletableFuture.completedFuture("S3PATH");
when(executorPool.submit(Mockito.<Callable<String>> anyObject())).thenReturn(result);
柴茂材
2023-03-14

捕获将始终返回上次捕获的对象。在您的情况下,您似乎希望同步提交和获取。

因此,我认为你应该做以下几点:

    ExecutorService executorServiceMock = createMock(ExecutorService.class);

    expect(executorServiceMock.submit(EasyMock.<Callable<?>>anyObject()))
        .andAnswer(() -> {
            Future future = createMock(Future.class);
            Object value = ((Callable<?>) getCurrentArguments()[0]).call();
            expect(future.get()).andReturn(value);
            replay(future);
            return future;
        })
        .anyTimes();

    executorServiceMock.shutdown();
    expectLastCall().anyTimes();

    replay(executorServiceMock);

    return executorServiceMock;
蒋弘致
2023-03-14

首先,“不要模仿你没有的类型!”。通过链接,您可能会找到几个不应该这样做的原因。

但是,如果您真的想这样做,那么通过应答替换返回模拟每次都会创建一个新的nock:

EasyMock.expect(executorServiceMock.submit(EasyMock.<Callable<?>>capture(callableCapture))).andAnswer(() -> {
    Future future = EasyMock.createMock(Future.class);
    EasyMock.expect(future.get()).andAnswer(() -> callableCapture.getValue().call()).anyTimes();
    EasyMock.replay(future);
    return future;
}).anyTimes();

顺便说一下,您不能期望PowerMock.expectNew(Future.class),因为Future是接口,无法创建。

 类似资料:
  • 问题内容: 我正在使用AngularJS 1.4.0和服务。以下代码将始终打印出一个空对象: 我试过了: 使用AngulerJS 1.3.15,并且在刷新浏览器时cookie不会持久存在(但至少会创建cookie)。 添加有效期。 确保在我的浏览器(Chrome)中启用了Cookie。 尝试使用普通的旧JS,但仍然无法正常工作。 我在任何地方都找不到类似的问题。 谢谢。 问题答案: 对于偶然发现此

  • 我用Spring 4和Spring security设置了一个简单的REST API web.xml AccountController.java mysabisabi-servlet.xml mysabisabi-security.xml 应用程序上下文.xml 日志文件 当我尝试访问 我得到 我已经尝试了 和作为url模式,但仍然相同。 有人能指出我错过了什么吗? 谢了。

  • 问题内容: 我以前使用过媒体播放器,但从未遇到过此问题。每当我尝试使用MediaPlayer.create()时,该方法都会使我为null,并且无法播放声音。有什么我想念的吗? 我的sound.mp3在我的原始文件夹中,通过将声音拖到eclipse中的文件夹中,我将其放置在其中。请帮忙,因为我以前玩过声音,所以这真的困扰我:( 问题答案: 如果create() API由于某种原因失败,则返回nul

  • 问题内容: 尽管是有效的类,但以下代码会打印。 文档说方法返回 由 aClassName 命名的类对象,或者如果当前没有加载该名称的类。如果 aClassName 为,则返回。 我也试图获得当前的viewcontroller已加载但仍然得到 可能是什么问题? 更新: 即使尝试这样做,我仍然可以 问题答案: 该函数 确实 适用于(纯和Objective-C派生的)swift类,但是仅当您使用全限定名

  • 问题内容: 我觉得有点愚蠢,但它不起作用: 我有如果给定的用户是unicode。如果字符串中包含或,我想打印成功,但是我总是得到的结果。 问题答案: 隐式锚定到字符串的开头。如果要在字符串中搜索可以在字符串中任何位置的子字符串,则需要使用: 输出: 另外,Python Regexes不需要在开头和结尾都有一个。 最后,我添加到该行的末尾,因为我认为这就是您想要的。否则,您会得到类似的信息,但并不太

  • 我的安全配置似乎不正确。无论我在使用hasRole时做什么,我的endpoint总是返回403。 此外,除非我在这两个和。很明显,我遗漏了一些东西。 基本上,我希望所有内容都需要身份验证,但只有当用户是某些组的成员时(现在只需要admin),少数endpoint才可以访问。 我的安全配置如下。旁边的一切都有效。 我的AuthenticationConfiguration如下 我的Authoriza