Ich habe eine gut spezifizierte Schnittstelle und gegen, dass ich meine JUnit-Tests schreiben:Kann ich mehrere ausgelöste Ausnahmen in einer Testmethode testen?
public interface ShortMessageService {
/**
* Creates a message. A message is related to a topic
* Creates a date for the message
* @throws IllegalArgumentException, if the message is longer then 255 characters.
* @throws IllegalArgumentException, if the message ist shorter then 10 characters.
* @throws IllegalArgumentException, if the user doesn't exist
* @throws IllegalArgumentException, if the topic doesn't exist
* @throws NullPointerException, if one argument is null.
* @param userName
* @param message
* @return ID of the new created message
*/
Long createMessage(String userName, String message, String topic);
[...]
}
Wie Sie die Implementierung verschiedene Ausnahmen auslösen kann, für die wir haben Tests schreiben sehen können. Mein aktueller Ansatz ist ein Testverfahren für eine mögliche Ausnahme in der Schnittstelle wie folgt angegeben zu schreiben:
public abstract class AbstractShortMessageServiceTest
{
String message;
String username;
String topic;
/**
* @return A new empty instance of an implementation of ShortMessageService.
*/
protected abstract ShortMessageService getNewShortMessageService();
private ShortMessageService messageService;
@Rule
public ExpectedException thrown = ExpectedException.none();
@Before
public void setUp() throws Exception
{
messageService = getNewShortMessageService();
message = "Test Message";
username = "TestUser";
topic = "TestTopic";
}
@Test
public void testCreateMessage()
{
assertEquals(new Long(1L), messageService.createMessage(username, message, topic));
}
@Test (expected = IllegalArgumentException.class)
public void testCreateMessageUserMissing() throws Exception
{
messageService.createMessage("", message, topic);
}
@Test (expected = IllegalArgumentException.class)
public void testCreateMessageTopicMissing() throws Exception
{
messageService.createMessage(username, message, "");
}
@Test (expected = IllegalArgumentException.class)
public void testCreateMessageTooLong() throws Exception
{
String message = "";
for (int i=0; i<255; i++) {
message += "a";
}
messageService.createMessage(username, message, topic);
}
@Test (expected = IllegalArgumentException.class)
public void testCreateMessageTooShort() throws Exception
{
messageService.createMessage(username, "", topic);
}
@Test (expected = NullPointerException.class)
public void testCreateMessageNull() throws Exception
{
messageService.createMessage(username, null, topic);
}
[...]
}
So jetzt habe ich viele Prüfverfahren definieren muß, um für diese eine Methode in der Schnittstelle definiert und das fühlt sich peinlich. Kann ich alle diese Ausnahmetests in einer Testmethode kombinieren oder was ist die beste Vorgehensweise?
Das ist gut, aber man kann dies die ExpectedException Regel verbessern: https://github.com/junit-team/junit/blob/master/src/main/java/org/junit /rules/ExpectedException.java –