2011-12-09 28 views
0

私はちょうどnettyを使ってプロジェクトを継承しましたが、nettyインターフェイスなどを実装することで多くのハンドラが作成されているという点で、コード自体に絡み合っているようです。netty APIからテストするテストを追加することができますバイトを送信し、受信したバイトを受信しますが、ソケットを接続することはできません。私たちのコードだけでなくネットコードもテストし、コードから受け取るパイプラインに自分自身を起動する方法はありますか?Nettyを模擬する方法は?

具体的には、私はこのような何かを探しています:

SysUnderTest(channel) { 
    channel.addReadListener(myListenerImpl); 
} 

Test { 
    testStuff() { 
     channelMock = new MockChannel(); 
     SysUnderTest system = new SysUnderTest(channelMock); 
     //BIG NOTE: The get here is just getting what the mocked cached when the SysUnderTest 
     //ended up calling the channel.addReadLsitener(listenerImpl)!!! 
     ReadListener listenerImplToTest = channelMock.getAddedListenerImpl(); 
     listenerImplToTest.fireNewDataIncoming(byteBuffer1); 
     Assert.Equals("new state", system.getState()); 
     listenerImplToTest.fireNewDataIncoming(byteBuffer2); 
     Assert.Equals("state2", system.getState()); 
    } 
} 

たぶん私はパラダイムシフトを必要とするが、私はIOライブラリと任意のシステムテストが反応するリスナーにデータを発射されるべきだと思います。私のテストでは、リスナー実装のイベントメソッドを呼び出すことでデータを起動する必要があります(また、モックチャンネルを使用してlistenerImplを取得します)。しかし、Nettyでこれを行う方法はわかりません。具体的には、どのメソッドが上記の例のデータを起動していますか。それはデータを読み込んでいるようです(これはブロッキング/ポーリングのようなものです)。たぶん私はこれについて考えている方法の私のパラダイムを変更する必要がありますか?

答えて

4

はい、javadoc、特にDecoderEmbedderクラスの埋め込みパッケージを見てください。

+0

うーむ、それは「パイプラインを設定せずに」私はモック何かを渡すところ本当にここにフルブローQAテストをシミュレートしようとしていますが、createpipelineは私がすることができます....コードによって行われていると言います本当にそれを変えないでください。これはやはり何とか働くでしょうか? –

0

モックオブジェクトを試すことができます。

https://github.com/netty/netty/pull/119を参照してください。

@Test 
public void testPerformOpeningHandshake() { 
    Channel channelMock = EasyMock.createMock(Channel.class); 

    DefaultChannelPipeline pipeline = createPipeline(); 

    EasyMock.expect(channelMock.getPipeline()).andReturn(pipeline); 

    // capture the http response in order to verify the headers 
    Capture<HttpResponse> res = new Capture<HttpResponse>(); 
    EasyMock.expect(channelMock.write(capture(res))).andReturn(new DefaultChannelFuture(channelMock, true)); 

    replay(channelMock); 

    HttpRequest req = new DefaultHttpRequest(HTTP_1_1, HttpMethod.GET, "/chat"); 
    req.setHeader(Names.HOST, "server.example.com"); 
    req.setHeader(Names.UPGRADE, WEBSOCKET.toLowerCase()); 
    req.setHeader(Names.CONNECTION, "Upgrade"); 
    req.setHeader(Names.SEC_WEBSOCKET_KEY, "dGhlIHNhbXBsZSBub25jZQ=="); 
    req.setHeader(Names.SEC_WEBSOCKET_ORIGIN, "http://example.com"); 
    req.setHeader(Names.SEC_WEBSOCKET_PROTOCOL, "chat, superchat"); 
    req.setHeader(Names.SEC_WEBSOCKET_VERSION, "13"); 

    WebSocketServerHandshaker17 handsaker17 = new WebSocketServerHandshaker17("ws://example.com/chat", "chat", false); 
    handsaker17.performOpeningHandshake(channelMock, req); 

    Assert.assertEquals("s3pPLMBiTxaQ9kYGzzhZRbK xOo=", res.getValue().getHeader(Names.SEC_WEBSOCKET_ACCEPT)); 
    Assert.assertEquals("chat", res.getValue().getHeader(Names.SEC_WEBSOCKET_PROTOCOL)); 
} 
+0

その例であなたのシステムはテストされていますか? WebSocketServerHandshaker17?もしそうなら、私はchannelMockを与えた後、ちょうどそれがnioからシステムにプッシュされているのと同じようにデータをプッシュする必要があります。読み込まれないでしょう。なぜなら、nioの読み込みではすべてがプッシュされるからです。私のポストを少し編集する –