Я думаю, что этот вопрос нуждается в обновленном ответе, так как большинство ответов здесь довольно устарели.
Во-первых, на вопрос ФП в:
Я думаю, что его довольно хорошо принят, что введение понятия «ожидается excepetion» в JUnit был плохой ход, так как это исключение может быть поднят в любом месте, и он будет проходить тест. Он работает, если вы бросаете (и утверждаете) очень специфичные для домена исключения, но я бросаю только те исключения, когда я работаю над кодом, который должен быть абсолютно безукоризненным, - почти APIS просто бросает встроенные исключения, такие как IllegalArgumentException
или IllegalStateException
. Если два вызова, которые вы делаете, могли бы потащить эти исключения, то аннотация @ExpectedException
будет зеленой, если вы ошиблись, это исключает!
В этой ситуации я написал класс, который я уверен, что многие другие здесь написали, что это assertThrows
метод:
public class Exceptions {
private Exceptions(){}
public static void assertThrows(Class<? extends Exception> expectedException, Runnable actionThatShouldThrow){
try{
actionThatShouldThrow.run();
fail("expected action to throw " + expectedException.getSimpleName() + " but it did not.");
}
catch(Exception e){
if (! expectedException.isInstance(e)) {
throw e;
}
}
}
}
этот метод просто возвращает, если исключение, что позволяет сделать дальнейшие утверждения/проверки в вашем тесте.
с синтаксисом java 8 ваш тест выглядит очень хорошо.Ниже один из самых простых тестов на нашей модели, которая использует метод:
@Test
public void when_input_lower_bound_is_greater_than_upper_bound_axis_should_throw_illegal_arg() {
//setup
AxisRange range = new AxisRange(0,100);
//act
Runnable act =() -> range.setLowerBound(200);
//assert
assertThrows(IllegalArgumentException.class, act);
}
эти тесты немного шаткий, так как «действовать» шаг фактически не выполняет никаких действий, но я думаю, что смысл все еще довольно Чисто.
есть также небольшая библиотека на maven под названием catch-exception, которая использует синтаксис стиля mockito для проверки того, что выбраны исключения. Это выглядит красиво, но я не поклонник динамических прокси. Тем не менее, синтаксис там так гладко остается заманчивыми:
// given: an empty list
List myList = new ArrayList();
// when: we try to get the first element of the list
// then: catch the exception if any is thrown
catchException(myList).get(1);
// then: we expect an IndexOutOfBoundsException
assert caughtException() instanceof IndexOutOfBoundsException;
И, наконец, в ситуации, что я столкнулся, чтобы добраться до этой темы, есть способ игнорировать тестов, если некоторый conidition удовлетворяются.
В настоящее время я работаю над получением некоторых DLL, вызванных через библиотеку-библиотеку java-библиотеки, называемую JNA, но наш сервер сборки находится в ubuntu. Мне нравится пытаться управлять этим развитием с помощью тестов JUnit - даже если они далеки от «единиц» на этом этапе. То, что я хочу сделать, это запустить тест, если я нахожусь на локальной машине, но проигнорируйте тест, если мы на ubuntu. JUnit 4 имеет положение для этого, называемого Assume
:
@Test
public void when_asking_JNA_to_load_a_dll() throws URISyntaxException {
//this line will cause the test to be branded as "ignored" when "isCircleCI"
//(the machine running ubuntu is running this test) is true.
Assume.assumeFalse(BootstrappingUtilities.isCircleCI());
//an ignored test will typically result in some qualifier being put on the results,
//but will also not typically prevent a green-ton most platforms.
//setup
URL url = DLLTestFixture.class.getResource("USERDLL.dll");
String path = url.toURI().getPath();
path = path.substring(0, path.lastIndexOf("/"));
//act
NativeLibrary.addSearchPath("USERDLL", path);
Object dll = Native.loadLibrary("USERDLL", NativeCallbacks.EmptyInterface.class);
//assert
assertThat(dll).isNotNull();
}
Просто используйте оператор return - в большинстве случаев это будет проходить как pass(). – topchef
@topchef, что единственный комментарий ударил молотком по голове, в то время как все остальные дебаты о том, что приемлемо, а что нет. – 2013-01-04 19:45:16
Проверено несколько тестовых систем (perl Test :: Simple) и неудачных утверждений. Однако Junit подсчитывает количество методов _test_, которые проходят и терпят неудачу. Таким образом, Junit не имеет одинакового использования для метода pass. –