2014-02-02 5 views
5

у меня есть что-то вродеJUnit продолжают утверждать вещи после ожидаемого исключения

@Test(expected = IllegalArgumentException.class) 
public void cdIntoNonExistantFolder() { 
    cdTool.changeDirectory("nonexistant"); 
    assertThat(cdTool.getStatusCode(), not(equalTo(0))); 
} 

Я считаю, что assertThat не запускается как changeDirectory выбросит исключение. Можно ли еще запустить его?

+1

Так что 'cdTool' выдает исключение _and_ устанавливает статус? Зачем? –

ответ

7

Вы можете использовать finally:

@Test(expected = IllegalArgumentException.class) 
public void cdIntoNonExistantFolder() { 
    try { 
     cdTool.changeDirectory("nonexistant"); 
    } 
    finally { 
     assertThat(cdTool.getStatusCode(), not(equalTo(0))); 
    } 
} 
-4

Создайте новый метод, и поставить Assert в этом методе, аннотировать этот метод @After

@Test(expected = IllegalArgumentException.class) 
public void cdIntoNonExistantFolder() { 
    cdTool.changeDirectory("nonexistant"); 
} 

@After 
public void after() { 
    assertThat(cdTool.getStatusCode(), not(equalTo(0))); 
} 
+1

После аннотации следует содержать код, необходимый для целого или, по крайней мере, большинства тестов в тестовом классе. –

+1

Вы не хотите писать код, который передает глобальные эффекты. –

6

я предпочел бы избежать каких-либо попробовать/уловов в единичных тестах. Вот одна возможности с Catch-Exception:

@Test 
public void cdIntoNonExistantFolder() { 
    catchException(cdTool).changeDirectory("nonexistant"); 

    assertThat(caughtException(), instanceOf(IllegalArgumentException.class)); 
    assertThat(cdTool.getStatusCode(), not(equalTo(0))); 
} 

или с JUnit 5:

@Test 
public void cdIntoNonExistantFolder() { 
    expectThrows(IllegalArgumentException.class,() -> { 
     cdTool.changeDirectory("nonexistant"); 
    }); 

    assertThat(cdTool.getStatusCode(), not(equalTo(0))); 
} 
2

Я предпочитаю избегать использования ожидаемой аннотации исключения. Причина часто заключается в том, что «устраивать» утверждения перед частью действия «действовать». Эти разделы «организовать» могут вызвать ожидаемое исключение, и тест пройдет с ложным положительным результатом.

Вместо этого я бы использовал структуру try/catch вокруг метода-under-test.

@Test 
public void cdIntoNonExistantFolder() { 
    try { 
     cdTool.changeDirectory("nonexistant"); 
     Assert.fail("Should have thrown IllegalArgumentException"); 
    } 
    catch (IllegalArgumentException e) { 
     Assert.assertTrue(true); 
     assertThat(cdTool.getStatusCode(), not(equalTo(0))); 
    } 
} 

Две вещи, чтобы отметить:

  1. Блок попытка должен иметь метод
  2. Я использую Assert.assertTrue (истина) Assert.fail(); в блоке catch, чтобы показать , что это путь.
+1

Вы можете избежать ложного положительного результата с помощью правила ExpectedException и установить его только после того, как сделали все ваши «упорядочивающие» утверждения. – Steiny

Смежные вопросы