【发布时间】:2014-04-25 04:41:28
【问题描述】:
我有一个 JUnit 测试,我正在测试一个带有空参数的方法。如果参数 /arguments 为 null,那么我将抛出 NullPointerException。该方法本身只会抛出一个 IOException。我在类的模拟对象上使用 doThrow,但在我看来,我正在丢失 doThrow() 构造中的异常并且我无法捕获它。此外,我绝对不想在我的单元测试中使用 try catch。所以我同样使用@Rules。这是代码sn-p:
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 测试中捕获的异常是否错误。
【问题讨论】:
-
"我绝对不想在我的单元测试中使用 try catch"
-
只是给我的一个要求。
-
还有实际抛出的异常吗?
-
好吧,方法“createTable”只是没有专门抛出 IllegalArgumentException。在方法体的开头,我有检查 null 等的前提条件
-
而前提是什么?如果
.checkNotNull()它将在失败时抛出 NPE,而不是IllegalArgumentException。如果是这种情况,你不应该.doThrow(),甚至spy()都不需要,因为这是你唯一想要测试的东西
标签: java exception junit mocking mockito