Во-первых, assertTrue
и его родственники (assertFalse
, assertThat
) - это все статические методы. Можно было бы импортировать статический метод их утверждения выбора (и который живет в Assert
, поэтому assertTrue
является сокращением для Assert.assertTrue
).
Во-вторых, утверждение имеет место с относительно к объекту, но не как свойство этого. На мой взгляд, не имеет смысла проводить утверждения к конкретному объекту, если утверждение является фактическим свойством объекта.
В-третьих, когда вы извлекаете свой результат (я полагаю, это то, что вы делаете), вы хотите получить ответ от объекта конкретного объекта, который вы тестируете. Я не понимаю вашу конструкцию для получения Result
, так как то, что вы собираетесь тестировать в модульном тесте, - это всего лишь часть кода - что-то маленькое, прямое, чтобы проверить, и что-то, что не мешает рефакторингу.
Вот как я обычно пишу модульные тесты. Надеюсь, это даст вам некоторое разъяснение относительно того, что я хочу из своих тестов, и что я буду тестировать.
Use case: Я написал утилиту для извлечения заданной разницы между двумя Lists
с очевидным предупреждением о наличии дубликатов. Это какой-то код, который я помню, чтобы собрать еще один ответ, но мне понравилось, что я его уточнил, и написал тесты для обеспечения поведения.
Вот что такое модульные тесты. Обратите внимание, как я утверждаю, в принципе, одно. Это нарушает некоторый принцип OO, но когда вы пишете тесты, вы хотите утверждать поведение и результаты.
@Test
public void testDifference() throws Exception {
//given
List<Integer> left = Lists.newArrayList(1, 2, 3, 4, 5);
List<Integer> right = Lists.newArrayList(1, 2, 4, 5);
//when
List<Integer> result = SetUtils.difference(left, right);
//then
assertEquals(Lists.newArrayList(3), result);
}
@Test
public void testDifference2() throws Exception {
//given
List<Integer> left = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 9, 10);
List<Integer> right = Lists.newArrayList(1, 2, 4, 5, 10);
//when
List<Integer> result = SetUtils.difference(left, right);
//then
assertEquals(Lists.newArrayList(3, 6, 7, 9), result);
}
Если вы по-прежнему вниз далеко, позвольте мне проиллюстрировать одно из преимуществ для написания модульных тестов в этом поведении. Если бы я хотел отказаться от использования цикла while и вместо этого использовать foreach
, я мог бы с уверенностью выполнять этот рефакторинг; способ структурирования модульных тестов позволяет мне, на первый взгляд, увидеть и ожидать, что я честно хочу от этого кода.
Я не мог честно представить, что пытаюсь это сделать, если действительность была частью статического состояния. Это было бы жестким, чтобы снять.
Спасибо за подробный ответ !!! – Frank