Java 在doThrow JUNIT之后捕获异常
我有一个JUnit测试,其中我正在测试一个带有空参数的方法。如果参数为null,那么我将抛出NullPointerException。该方法本身只会抛出一个IOException。我在类的mock对象上使用doThrow,但在我看来,doThrow()构造中的异常正在丢失,我无法捕获它。此外,我严格不希望在单元测试中使用try-catch。因此,我使用@Rules进行同样的操作。以下是代码片段: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
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,然后不要使用先决条件(
;)该死的…当我有东西要检查的时候,我不想有这么多的设计变更。。!!!