gpt4 book ai didi

java - 我可以在一种测试方法中测试多个抛出的异常吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:00:00 24 4
gpt4 key购买 nike

我有一个明确指定的接口(interface),并针对它编写我的 JUnit 测试:

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);

[...]

}

如您所见,实现可以抛出各种异常,我必须为其编写测试。我目前的做法是为接口(interface)中指定的一种可能的异常编写一种测试方法,如下所示:

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);
}

[...]

}

所以现在我必须为接口(interface)中定义的那个方法定义很多测试方法,这感觉很尴尬。我能否将所有这些异常测试组合在一种测试方法中,或者最佳做法是什么?

最佳答案

不幸的是,@Test 注释不允许捕获多个异常类型(api 引用 http://junit.sourceforge.net/javadoc/org/junit/Test.html)。

作为第一个选择,我会提倡转向 TestNG。如果您的团队不允许这样做,那么您在 JUnit 中几乎无能为力。

绝对使用参数化测试用例,这样您就不必为每个测试用例编写一个测试函数 (http://junit.sourceforge.net/javadoc/org/junit/runners/Parameterized.html)。从这里开始,有几个选项。

  1. 按异常类型对测试数据进行分组。

    @Test (expected = IllegalArgumentException.class)
    public void testIllegalArgumentException(String username, String message, String topic) {}

    @Test (expected = NullPointerException.class)
    public void testNullPointerException(String username, String message, String topic) {}
  2. 在您的方法签名中组合异常类型。 (这是我推荐的)粗略的概述如下......

    public void testException(String username, String message, String topic, Class<? extends Exception>[] expectedExceptionClasses) {
    try {
    // exception throwing code
    } catch (Exception e) {
    boolean found = false;
    for (Class<?> expectedException : expectedExceptions) {
    if (e instanceof expectedException) {
    found = true;
    }
    }
    if (found) {
    return;
    }
    }
    Assert.fail();
    }
  3. 将您所有的测试都放在 Exception 类的保护伞下(我觉得您不想这样做。)。

    @Test (expected = Exception.class)
    public void testException(String username, String message, String topic) {}

关于java - 我可以在一种测试方法中测试多个抛出的异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20603047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com