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

Kenichiro Murata muraken720
2006年 2月 18日 (土) 00:46:23 JST


To:小林さん

むらたです。

コメントありがとうございました。

コメントを読みながらArgumentsMatcherを使い、
BytesMessageBinderTestを修正しました。

が、、、まだ上手くいっていません。orz

テストを実行すると以下の例外が発生してしまいます。

-----------
java.lang.IllegalStateException: missing behavior definition for the
preceeding method call readBytes([B @ ca2dce)
	at org.easymock.MockControl.replay(MockControl.java:174)
	at org.seasar.jca.unit.EasyMockTestCase.replay(EasyMockTestCase.
java:54)
	at
org.seasar.jca.unit.EasyMockTestCase$Subsequence.doTest(EasyMockTestCase
.java:81)
	at
org.seasar.jms.container.impl.BytesMessageBinderTest.testGetPayLoad(Byte
sMessageBinderTest.java:80)
-----------

すみませんが、現状版をコミットしましたので
一度見て頂けないでしょうか。

以上、よろしくお願いします。

-----
村田 賢一郎(Kenichiro Murata)
mailto: muraken720 @ msj.biglobe.ne.jp

> -----Original Message-----
> From: seasar-dev-bounces @ lists.sourceforge.jp
> [mailto:seasar-dev-bounces @ lists.sourceforge.jp] On Behalf Of
> Koichi Kobayashi
> Sent: Friday, February 17, 2006 1:31 AM
> To: seasar-dev @ lists.sourceforge.jp
> Subject: [Seasar-dev:262] Re: [S2JMS]ArgumentsMatcher の使い方
>
>
> 小林 (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[] expected Bytes = (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 mailing list
> Seasar-dev @ lists.sourceforge.jp
> http://lists.sourceforge.jp/mailman/listinfo/seasar-dev
>
>




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