我有一个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测试中捕获异常是否错误。
答案 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);
}
之外什么也没做,然后检查你的存根是否正常 - 这对我来说似乎毫无意义。