akkaのStashを使ったActorのテストを書く際の注意点

akkaにはstashという
「今ちょっとそのメッセージ処理したくない(できない)ので、ちょっと別のところに退避させておいて、後から処理する」
という機能があります。
それの話。akkaのversionはこれ書いてる時点の最新の2.3.9としておきます。


ユースケースとしては、たとえばActor使ったRedisクライアント作ってるとして
「まだRedisに接続できていないときはメッセージためておいて、接続完了した後に送信」
とかでしょうか?

で、まぁ(あまりまだStashをすごく使ってるわけでもないが)便利なのですが、なんか酷い罠がありました。
akkaには、標準でTestActorRefというテスト用のなにかがあります。特に理由なければ、結構akkaのテスト中にはよく使うものです。

で、結論をいうと
「TestActorRefとStashは組み合わせられない」
らしいです。何だこの罠・・・

http://stackoverflow.com/a/18377939/605582

TestActorRef can't be used together with Stash. TestActorRef requires a CallingThreadMailbox and Stash requires DequeBasedMessageQueueSemantics.

Stashに関して、色々説明や制限は書いてありますが(メールボックスの種類に制限あるとか、preRestartに関すること)、TestActorRefに関しては直接そういうことかいてありませんでした・・・。

「メールボックスの種類に制限」 イコール 「TestActorRefと組み合わせられない」ということですかね?
そうだとしても、もっとわかりやすくTestActorRefの言葉を入れてドキュメント書いておいて欲しい・・・、もしくは実行時エラーでもいいので、それがわかるようなエラーメッセージ出して欲しい*1。(これ気がつくのに、かなり時間消費したので)

*1:単にstashが動いてないように見えるだけで、とくに有用なエラーメッセージは出なかった