2016-08-15 3 views
1

Как проверить, не метод ли ничего. Например, у меня есть статический метод, который генерирует исключение, если заданный аргумент строки является нулевым или пустым (он предназначен для проверки аргумента). Сейчас мои тесты выглядеть следующим образом:JUnit4 - Тест, если метод ничего не делает

@Test 
public void notNullOrEmpty_doesNothingIfValueIsNotNullOrEmpty() { 
    Require.notNullOrEmpty(Generate.randomString()); 
    assertTrue(true); // <- this looks very ugly 
} 

@Test(expected = IllegalArgumentException.class) 
public void notNullOrEmpty_throwsExceptionIfValueIsNull() { 
    Require.notNullOrEmpty(null); 
} 

@Test(expected = IllegalArgumentException.class) 
public void notNullOrEmpty_throwsExceptionIfValueIsEmpty() { 
    Require.notNullOrEmpty(""); 
} 

Как я могу сделать первый тест пройти без вызова assertTrue(true), есть Assert.fail() есть что-то вроде Assert.pass()?

EDIT: Добавлен отсутствующий (expected = IllegalArgumentException.class) на 3-й тест

+0

В случае Требовать класс действительно очень просто проверить на нуль или пустой рассмотреть возможность использования хорошо испытанные классы из библиотеки гуавы Preconditions.checkArgument (Strings.isNullOrEmpty («туЗЬптд»)); – sandrozbinden

+0

Также имейте в виду осторожно использовать случайные сгенерированные строки в качестве тестового ввода. См. Http://stackoverflow.com/questions/3441686/what-are-the-downsides-using-random-values-in-unit-testing – sandrozbinden

ответ

5

Вам нужно только удалить утверждение в первом методе.

@Test 
public void notNullOrEmpty_doesNothingIfValueIsNotNullOrEmpty() { 
    Require.notNullOrEmpty(Generate.randomString()); 
    // Test has passed 
} 

Если метод испытания работает полностью, значит, он прошел успешно. Посмотрите на выходе JUnit Затмения:

enter image description here

Update: как дополнительный комментарий, если вы используете рамки Mockito вы можете использовать verify метод, чтобы проверить, что метод был вызван раз X. Например, я использовал что-то вроде этого:

verify(cmAlertDao, times(5)).save(any(CMAlert.class)); 

В вашем случае, так как вы тестируете статические методы, то вы могли бы найти полезную с помощью PowerMock, которая позволяет проверить статические методы (с Mockito не делает). И вы можете использовать verifyStatic(...).

+0

, так что, просто не утверждая, что что-нибудь проведет тест? – danielspaniol

+0

@Exhauzt да, правильный. Я добавил обновление для ответа. Однако вы можете использовать фреймворк Mockito с 'verify', что метод называется величиной X. А также вы можете использовать PowerMock для проверки статических методов, вызываемых. –

+0

@Exhauzt, просто чтобы быть понятным, если вы используете только JUnit, тогда да, не утверждая, что что-то проведет тест. –

3

Вы должны добавить @Test(expected = YourException.class) аннотацию.

Попробуйте добавить к первому испытанию:

@Test 
public void notNullOrEmpty_doesNothingIfValueIsNotNullOrEmpty() { 
    String str = Generate.randomString(); 
    Require.notNullOrEmpty(str); 
    assertNotNull(str); 
} 

и, вероятно, у вас есть лучше переименовать его в notNullOrEmpty_doesNothingIfValueIsNotNullOrNotEmpty, потому что вы проверяете его не пустое значение.

+0

У меня есть это ... для тестов, где он должен вызывать исключение. Но я хочу сделать первый тест clearer – danielspaniol

0

Единичный тест должен утверждать, что ожидается в поведении метода.
Если в вашей спецификации, когда вы звоните notNullOrEmpty(), исключение должно быть выбрано, когда данные действительны, и при возникновении исключения должно быть выбрано исключение, если в вашем модульном тесте вы не должны делать никаких утверждений, если данные действительны, поскольку если это не удастся, исключение будет выброшено, и тест будет так неудачен.

@Test 
public void notNullOrEmpty_doesNothingIfValueIsNotNullOrEmpty() { 
    Require.notNullOrEmpty(Generate.randomString()); 
} 
Смежные вопросы