【问题标题】:How to mock static function inside Akka Actor scope?如何在 Akka Actor 范围内模拟静态函数?
【发布时间】:2017-09-01 14:43:46
【问题描述】:

我有一个演员,它从我想模拟的 Helper 调用静态方法:

public class ExampleActor extends AbstractActor {
    public Receive createReceive() {
        .match(CachedFile.class, cachedFile -> {
            UploadFileHelper.makeRequest(cachedFile.getContent());
            return true;
        });
    }
}

我试过嘲笑它:

@RunWith(PowerMockRunner.class)
@PrepareForTest(UploadFileHelper.class)
public class ExampleActorTest {

    @Test
    public void testCreateFile() {
        new TestKit(system) {{
            PowerMockito.mockStatic(UploadFileHelper.class);
            PowerMockito.when(
                UploadFileHelper.makeRequest(any())
            ).thenReturn(true);

            exampleActor.tell(cachedFile, getRef());
        }}
    }
}

但出于某种原因,调用的是真正的方法而不是模拟的方法。

为了在 Akka Actor 上下文中模拟静态方法,我应该做些什么改变?

【问题讨论】:

  • 静态方法是出了名的难以测试。考虑用实用程序中的实例方法替换。所有的静态保存都是对象构造。将实用程序实例作为依赖项传递给 Actor。
  • 然后我将在参与者和静态方法之间创建一个服务。谢谢!
  • 我同意:当您可以轻松摆脱 static 时 - 然后摆脱它。除此之外 - 你的代码看起来不错......我只是不明白你为什么在这里创建一个新的匿名内部类 - 不知道 TestKit 是关于什么的。
  • @GhostCat 谢谢,我正在关注此页面的示例:doc.akka.io/docs/akka/2.5/java/testing.html您是否推荐另一种测试 Akka Actors 的方法?

标签: java unit-testing junit akka powermockito


【解决方案1】:

当我使用mockStatic时,在

"main"@1 in group "main": RUNNING 

可以,但是在里面不行

"AkkaTestKit-akka.actor.default-dispatcher-3"@2,614 in group "main": RUNNING

创建道具时只需使用CallingThreadDispatcher。

final Props props = Props.create(ExampleActor.class).withDispatcher(CallingThreadDispatcher.Id());

它对我有用。

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多