[Seasar-dev:262] Re: [S2JMS]ArgumentsMatcher の使い方

Koichi Kobayashi koichik
2006年 2月 17日 (金) 01:30:42 JST


小林 (koichik) です.

Date:    Fri, 17 Feb 2006 00:35:45 +0900
From:    "Kenichiro Murata" <muraken720 @ msj.biglobe.ne.jp>
To:      <seasar-dev @ lists.sourceforge.jp>
Subject: [Seasar-dev:261] [S2JMS]ArgumentsMatcher の使い方

> やりたいことは、BytesMessageBinderの以下の部分にて
> bytesMessage.readBytes(payload)のpayloadに値を書き込む部分を
> EasyMcokで行います。
> 
> ----------
>     @Override
>     protected Object getPayload(Message message) throws JMSException {
>         byte[] payload = null;
>         if (message instanceof BytesMessage) {
>             BytesMessage bytesMessage = (BytesMessage) message;
>             int length = (int) bytesMessage.getBodyLength();
>             payload = new byte[length];
>             bytesMessage.readBytes(payload);
>         }
>         return payload;
>     }
> ----------

お,直ってますね.(^^;

> 小林さんのコメントから考えると、ArgumentsMatcher を継承したクラスを作
> り、
> その中で値を書き換えるようにする、という意味でよいでしょうか?

はい.
このような場合,Subsequence#verify() の中では

message.getBodyLength();
messageControl.setReturnValue(expect.length);
message.readBytes(expect);

のようにするわけですが,配列は同一性で比較されるため,
このままではテストに失敗します.
さらに,配列にデータを埋めるという副作用を
実現できないという問題があります.

そんなわけで (どんなわけで?),ArgumentsMatcher を使います.

message.readBytes(expect);
messageControl.setMatcher(new ArgumentsMatcher() {
    public boolean matches(Object[] expected, Object[] actual) {
        ...
    }
    public String toString(Object[] argument) {
        ...
    }
});

ここで matches() の expected はその直前の
readBytes(expect) の引数が配列で渡されます.
この場合は長さが 1 で,最初の要素が expect,
つまり byte 配列への参照です.

actual は Sequence#replay() の中から呼び出される
BytesMessageBinder#getPayload() の

>             bytesMessage.readBytes(payload);

の引数が配列で渡されます.
こちらも長さが 1 で,最初の要素が payload,つまり
byte 配列への参照です.
なので,

byte[] expectedBytes = (byte[]) expected[0];
byte[] actualBytes = (byte[]) actual[0];

ここでまずは検証をします.
つまり,二つの配列の長さが等しいかどうかですね.
不適切なら false でリターン.

その後,副作用をもたらします.
ここでは expectedBytes の内容を actualBytes に
コピーすればオッケー.



-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>koichik @ improvement.jp</e-mail>
</signature>



seasar-dev メーリングリストの案内