@Test public void test() { snake = new Snake(50, 50); assertHeadAntTail(50, 50, Direction.RIGHT, Direction.LEFT); } private void assertHeadAntTail(int x, int y, Direction headDirection, Direction tailDirection) { assertEquals(headDirection, snake.getDirection()); assertEquals(tailDirection, snake.getTailDirection()); assertEquals(x, snake.getHead().getX()); assertEquals(y, snake.getHead().getY()); }Их недостаток в том, что если слетает первый, то мы не увидим всей картины - остальные не отработают. Этот антипаттерн юнит-тестирования называется "Заяц" - обычно чтобы не писать несколько разных тестов, мы просто подселяем к существующему тесту еще один ассерт. Кстати тут пахнет даже имя метода - assertHeadAndTail :) но проигнорим на минутку этот запах.
Можно изворачиваться так, как я это делал раньше. Но сегодня придумался другой способ, более легковестный.
@Test public void test() { snake = new Snake(50, 50); assertHeadAntTail(50, 50, Direction.RIGHT, Direction.LEFT); } private void assertHeadAntTail(int x, int y, Direction headDirection, Direction tailDirection) { assertEquals( "[headX, headY, headDirection, tailDirection]", asString(x, y, headDirection, tailDirection), asString(snake.getHead().getX(), snake.getHead().getY(), snake.getDirection(), snake.getTailDirection())); } private String asString(Object...args) { return Arrays.asList(args).toString(); }Слетает так
junit.framework.ComparisonFailure: [headX, headY, headDirection, tailDirection] Expected :[50, 50, RIGHT, LEFT] Actual :[50, 50, RIGHT, DOWN] at com.codenjoy.dojo.snake.model.SnakeDirectionTest.assertHeadAntTail(SnakeDirectionTest.java:72) at com.codenjoy.dojo.snake.model.SnakeDirectionTest.test(SnakeDirectionTest.java:36)Меня устраивает!
Вот если бы только можно было бы находясь в методе получить список его параметров в текстовом виде, чтобы не писать вот так "[headX, headY, headDirection, tailDirection]" в каждом новом ассерте - было бы вообще идеально. Но эту головоломку остави на потом...
Я думаю с помощью рефлексии можно так сделать, но мне это не нравится.
ОтветитьУдалитьЕсть в junit Fluent-assertations как в его потомке nunit (порт junit в .NET), к примеру можно так
Assert.That(obj, Has.Property("Name").EqualTo("name")
.And.Property("OtherProperty").GreaterThan(1));
PS: ты читал Мессароша "xUnit test patterns"?