CollectionAssert у jUnit?


Відповіді:


125

Використовуючи JUnit 4.4, ви можете використовувати assertThat()разом із кодом Hamcrest (не хвилюйтеся, він постачається з JUnit, не потрібно додатково .jar) для створення складних самоописуючих тверджень, включаючи ті, що працюють з колекціями:

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

Використовуючи цей підхід, ви автоматично отримаєте хороший опис твердження, коли воно не вдається.


1
О, я ще не підозрював, що Хамкрест потрапив до динамічного дистрибутиву. Іди Нат!
skaffman

Якщо я хочу стверджувати, що l складається з елементів ("foo", "bar"), але жодних інших елементів не існує - чи є для цього простий синтаксис?
ripper234

Використовуйте наведений вище фрагмент коду та додайте додатковий assertTrue (l.size () == 2)
aberrant80

4
Мех, негарно. У NUnit це CollectionAssert.AreEqual (очікувана колекція, фактична колекція);
ripper234

1
Google знайшов ще одну відповідь Stackoverflow, яку я шукав!
Микола Голуб’єв

4

Не безпосередньо, ні. Я пропоную використовувати Hamcrest , який забезпечує багатий набір правил відповідності, який чудово інтегрується з jUnit (та іншими тестовими рамками)


Це не компілюється з якихось причин (див. Stackoverflow.com/questions/1092981/hamcrests-hasitems ): ArrayList <Integer> actual = new ArrayList <Integer> (); ArrayList <Integer> очікується = new ArrayList <Integer> (); actual.add (1); очікуваний.add (2); assertThat (фактичний, hasItems (очікуваний));
ripper234

2

Погляньте на FEST Fluent Assertions. IMHO вони зручніші у використанні, ніж Hamcrest (і однаково потужні, розширювані тощо) і мають кращу підтримку IDE завдяки вільному інтерфейсу. Див. Https://github.com/alexruiz/fest-assert-2.x/wiki/Using-fest-assertions


У 2017 році, здається, все більше людей використовують філію FEST під назвою AssertJ.
Макс.

2

Рішення Йоахіма Зауера приємне, але не працює, якщо у вас вже є цілий ряд очікувань, які ви хочете перевірити, чи є результати у вашому результаті. Це може виникнути, коли у вас вже є сформоване або постійне сподівання у тестах, з яким ви хочете порівняти результат, або, можливо, у вас є кілька очікувань, які, як ви очікуєте, будуть об’єднані в результаті. Отже, замість використання збігів ви можете просто використати List::containsAllта assertTrueНаприклад:

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}

Ви завжди можете використовувати hasItems(expected1.toArray(new String[expected1.size()])). Це дасть вам кращі повідомлення про помилки.
meustrus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.