Java 在doThrow JUNIT之后捕获异常

Java 在doThrow JUNIT之后捕获异常,java,exception,junit,mocking,mockito,Java,Exception,Junit,Mocking,Mockito,我有一个JUnit测试,其中我正在测试一个带有空参数的方法。如果参数为null,那么我将抛出NullPointerException。该方法本身只会抛出一个IOException。我在类的mock对象上使用doThrow,但在我看来,doThrow()构造中的异常正在丢失,我无法捕获它。此外,我严格不希望在单元测试中使用try-catch。因此,我使用@Rules进行同样的操作。以下是代码片段: public class TableTest { @Rule public ExpectedExc

我有一个JUnit测试,其中我正在测试一个带有空参数的方法。如果参数为null,那么我将抛出NullPointerException。该方法本身只会抛出一个IOException。我在类的mock对象上使用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的exception对象,如果我使用注释行捕获我的异常,在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测试中捕获的异常是否错误。

您似乎想测试该方法是否引发异常;但是通过使用
doThrow().when(sut).createTable(…)
可以阻止sut的正常行为

只要做:

final PersonTable table = new PersonTable();
table.createTable(null, null); // theoretically throws IllegalArgumentException
只需检查是否存在抛出的异常。不知道你是如何用你的
@规则做到这一点的,但我不使用这一点,在这里我将如何做到这一点:

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

您的问题是,您的测试实际上没有调用
createTable
,因此没有什么可以抛出异常。你可以写这个

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

但我真的不明白这样做的意义,因为你只是在测试Mockito。您正在对方法进行存根,这样它除了抛出
IllegalArgumentException
,然后检查存根是否正常工作-这对我来说似乎毫无意义。

“我严格来说不想在单元测试中使用try-catch”只是给我的一个要求。是否存在实际抛出的异常?嗯,方法“createTable”只是没有专门抛出IllegalArgumentException。在方法体的开头,我有检查null的前提条件,等等,前提条件是什么?如果
.checkNotNull()
它将在失败时抛出NPE,而不是
IllegalArgumentException
。如果是这样的话,你不应该非得
.doThrow()
,甚至
spy()
都不是,因为这是你唯一想测试的东西。这个测试仍然失败,但我明白了它背后的想法,可以从这里开始。我仍然不明白,当我说:public void someTestName()抛出IOException{}时,如果我传递null参数,我也会抛出一个IllegalArgumentException。我是否也应该在testName声明中抛出此异常?您不需要这样做,因为
IllegalArgumentException
是未经检查的异常抛出IOException的原因是,我的createTable方法抛出一个IOException,任何调用此方法的测试方法都需要抛出一个IOException,然后不要使用
先决条件(
;)该死的…当我有东西要检查的时候,我不想有这么多的设计变更。。!!!