在doThrow JUNIT之后捕获异常

时间:2014-03-19 05:49:59

标签: java exception junit mocking mockito

我有一个JUnit测试,我正在测试一个带有null参数的方法。如果参数/参数为null,那么我将抛出NullPointerException。该方法本身只会抛出IOException。我在类的模拟对象上使用doThrow,但在我看来,我在doThrow()构造中丢失了异常,我无法捕获它。另外,我严格不想在单元测试中使用try catch。所以我正在使用@Rules。以下是代码段:

public class TableTest {

@Rule
public ExpectedException exception = ExpectedException.none();
private static Table spyTable;

@Test
public void testCreateTableWithNullTableName_throwsIOEXception() throws IOException {
    final String tableName = null;
    mockConfig = mock(Configuration.class);
    spyPersonTable = spy(new PersonTable());
    doThrow(new IllegalArgumentException()).when(spyPersonTable).createTable(tableName, mockConfig);
    // exception.expect(IllegalArgumentException.class);
}

使用@ rule的异常对象,如果我使用注释行来捕获我的异常,doThrow()构造中创建的异常将丢失,我无法捕获它。我的单元测试将失败并抱怨:

Expected test to throw an instance of java.lang.IllegalArgumentException

如果我对该行进行了评论,那么测试工作正常。以下是我试图测试的方法:

public void createTable(final String tableName, final Configuration config) throws IOException 

该方法需要抛出IOException,因为在表创建期间抛出的特定异常是IOException的子类。

对于这种类型的检查异常,我在JUnit测试中捕获异常是否错误。

2 个答案:

答案 0 :(得分:3)

您似乎想测试该方法是否抛出异常;但是使用doThrow().when(sut).createTable(...)阻止 SUT正常行为。

只是做:

final PersonTable table = new PersonTable();
table.createTable(null, null); // theoretically throws IllegalArgumentException

然后检查是否存在抛出的异常。不知道你是如何使用@Rule那样做的,但是我不能使用它,在这里我是如何做到的:

final PersonTable table = new PersonTable();
try {
    table.createTable(null, null);
    fail("No exception thrown!");
} catch (IllegalArgumentException e) {
    assertEquals(e.getMessage(), "the expected message");
}

答案 1 :(得分:0)

您的问题是您的测试实际上并未调用@Namespace(reference="your refrence", prefix="m") ,因此没有任何内容可以抛出异常。你可以写这个。

createTable

但我真的没有意识到这一点,因为你真的只是在测试Mockito。你正在对方法进行简化,除了抛出@Test public void testCreateTableWithNullTableName_throwsIOEXception() throws IOException { final String tableName = null; mockConfig = mock(Configuration.class); spyPersonTable = spy(new PersonTable()); doThrow(new IllegalArgumentException()).when(spyPersonTable).createTable(tableName, mockConfig); exception.expect(IllegalArgumentException.class); spyPersonTable.createTable(tableName, mockConfig); } 之外什么也没做,然后检查你的存根是否正常 - 这对我来说似乎毫无意义。