最近,我尝试为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)。
由于使用的是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被发送请