Michael Ossareh wrote:
In the case above the code in messageReceived() cannot trigger
assertion failures, the exception they throw is trapped by the
framework and JUnit thinks the test passed. I'm using Assert.fail()
because the test I'm doing isn't part of JUnit's base tests (though I
understand I should start checking out the hamcrest matchers for my
tests:
http://stackoverflow.com/questions/958460/creating-a-assertclass-method-in-junit
) however using "normal" assertion fails suffer the same issue, for
example assertEquals(1, 2) results in the test passing beacause junit
doesn't ever see the exception.
Clearly you'll see the power of this type of testing, the 20 or tests
I have to write are all structured the same. Connect client to server,
either client or server send data, ensure data is rendered same on the
receiving side.
I'm midway through building a solution to this, however some of it
really reinventing the wheel and all because
IoHandlerAdapter.messageReceived / sessionOpened / sessionCreated all
throw Exception and/or the framework doesn't allow the ability to
distinguish different Exceptions from this layer.
mike
A couple of suggestions:
1) I'd think you really shouldn't need to go through the whole process
of fully starting up the server (with a socket listener listening on a
port) and a client (opening a socket to the server) just to do testing.
I don't know your code so well so perhaps I'm wrong here. But I'd
think it should be sufficient to just *simulate* network communication
by using a DummySession and sending a message down the server's filter
chain and seeing what response - or lack thereof - gets generated.
2) If you follow along with that approach, then you won't be in the
situation where your client is performing assertions inside the
messageReceived method (which are obviously getting swallowed). If you
look carefully at the code I posted, you'll see that what I'm doing is
to add an "OutputListener" - a class that I use only to assist with
testing - at the end of my filter chain when I test. The output
listener, true to its name, listens to whatever output/response the
server's filter chain processing generates, and saves it. Once that
whole server filter chain interaction is complete, and I've "saved" the
output from my "communication with the server", only THEN do I go about
issuing Asserts to verify that the output was what I expected. And
since these asserts get done outside of the MINA filter chain processing
they never get swallowed.
Bottom line: I think you can do any type of JUnit testing you want
against your MINA server, but you need to write your tests differently.
HTH,
DR