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

使用JUnit对akka参与者进行单元测试

劳通
2023-03-14

最近,我尝试为akka参与者编写一些单元测试,以测试参与者消息流。我在测试中观察到一些奇怪的行为:

private TestActorRef<Actor> sut;
private ActorSystem system;


JavaTestKit AnotherActor;
JavaTestKit YetAnotherActor;
@Before
public void setup() throws ClassNotFoundException {
    system = ActorSystem.apply();

    AnotherActor = new JavaTestKit(system);
    YetAnotherActor  = new JavaTestKit(system);


    Props props = MyActor.props(someReference);

    this.sut = system.of(props, "MyActor"); }                 

下一个

@Test
public void shouldDoSth() throws Exception {
    // given actor
    MyActor actor = (MyActor) sut.underlyingActor();

    // when 
    SomeMessage message = new SomeMessage(Collections.emptyList());
    sut.tell(message, AnotherActor.getRef());

    // then
    YetAnotherActor.expectMsgClass(
        FiniteDuration.apply(1, TimeUnit.SECONDS),
        YetSomeMessage.class);

}

在我的代码中,我有:

private void processMessage(SomeMessage message) {
    final List<Entity> entities = message.getEntities();
    if(entities.isEmpty()) {
        YetAnotherActor.tell(new YetSomeMessage(), getSelf());
        // return;
    }

    if (entities > workers.size()) {
        throw new IllegalStateException("too many tasks to be started !");
    }

}

基本上,有时(很少)这样的测试失败(在另一个操作系统上),并且抛出processMessage方法的异常(由于业务逻辑导致的IllegalStateException)。

共有1个答案

姚自强
2023-03-14

由于使用的是TestActorRef,所以基本上是在进行同步测试。根据一般经验,除非确实需要,否则不要使用TestActorRef。它使用CallingThreadDispatcher,也就是说,它将窃取调用者的线程来执行参与者。因此,这个谜的解决方案是,actor运行在与测试相同的线程上,因此异常最终出现在测试线程上。

幸运的是,您的这个测试用例根本不需要TestActorRef。您只需将actor创建为一个普通的actor,并且一切都应该工作(即actor将位于一个适当的独立线程上)。请尝试使用异步测试支持http://doc.akka.io/docs/akka/2.4.0/scala/testing.html#Asynchronous_integration_testing_with_testkit

 类似资料:
  • 我正在使用TestKit测试一个Scala项目的一些类,这个项目涉及Akka Actor,我遇到了这个问题: 所讨论的类如下所示: 我以前没有这个问题,因为我有

  • 我是TDD的忠实粉丝,我通常在编写代码之前为我的大学作业编写测试用例。下面是我作业的界面:

  • 我有DaoImpl类: 我的测试是: 测试是成功的,但是当我运行具有覆盖率的junit测试时,它显示方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。

  • 我已经创建了一个自定义弹性搜索客户端。我需要在各种功能上部署单元测试。我该怎么做呢? 下面是我的客户提供的一个方法。我应该如何在这里部署单元测试? 我该如何着手做这件事呢?

  • 我有这样一个简单的课程: 我想为它写一个测试,下面是一个框架: ErrorLogger类中的logger是由StaticLoggerBinder提供的,所以我的问题是-如何让它工作,以便那些检查“1*logger.error(u作为字符串)”可以工作?在ErrorLogger类中,我找不到一种恰当的方式来嘲笑那个记录器。我曾考虑过反射,并以某种方式访问它,此外,mockito注入也有一个想法(但如

  • 我开始探索akka-stream API,并希望对其进行测试。我有一个特定的用例,我似乎找不到合适的流式API来使用。 这个想法与以下内容相似,但有一点扭曲: 资料来源(1至10)。mapAsync(num)= 在这种情况下,ask将在未来返回一条消息。我想为发送给参与者的每个请求返回多条消息。例如: ActorRef被发送请求(2) ActorRef从流中发送N条消息。 ActorRef被发送请