[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 メーリングリストの案内