Является ли метод Assert-ing на tearDown (@After) неправильным? - PullRequest
5 голосов
/ 14 сентября 2010

У меня даже несколько тестовых случаев, и если логика отличается, выходные данные должны быть равны для всех. Поэтому я думал о том, как их обобщить и разместить метод Assert только один раз.

Есть ли способ лучше, чем этот:

static public class Tests() {

    private static String expected = null;
    private String actual = null;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        expected = new String("My Desired Output");
    }

    @Before
    public void setUp() {
        actual = new String();
    }

    @Test
    public void test1() throws Exception {
        actual = ...
    }

    @Test
    public void test2() throws Exception {
        actual = ...
    }

    @After
    public void tearDown() throws Exception {
        assertThat(actual, is(equalTo(expected)));
    }

    @AfterClass
    public static void tearDownAfterClass() {
    }
}

Метод бега:

@Test
public void runTests() {
    Result result = JUnitCore.runClasses(Tests.class);
    assertThat(result.getRunCount(), is(2));
    assertThat(result.getFailureCount(), is(0));
}

Ответы [ 2 ]

7 голосов
/ 14 сентября 2010

Да, утверждение в методе tearDown - плохая идея.Этот метод существует, согласно документации JUnit, для

Срывает устройство, например, закрывает сетевое соединение.Этот метод вызывается после выполнения теста.

Я думаю, что сохранение ваших ожидаемых и фактических значений в классе теста в целом является плохой идеей.Эти переменные зависят от тестов, поэтому сохраните их внутри тестового примера и сделайте свое утверждение в тестовом примере.Например:

public class FooTest {

    @Test
    public void testFoo() {
        Object expected = // ...
        Object actual = // ...

        assertThat(actual, is(equalsTo(expected)));
    }

}

Кроме того, я вижу в вашем коде, что все тесты имеют одинаковое ожидаемое значение.Было бы неплохо изменить ваши тесты, чтобы возвращаемые значения всегда были разными.Постоянно проверяя только одно ожидаемое значение, убедитесь, что код работает для этого ожидаемого результата.Попробуйте еще немного, возможно, совсем по-другому, и попробуйте проверить некоторые угловые случаи.

4 голосов
/ 14 сентября 2010

Если вам нужно обобщить, вы можете создать один метод, такой как

private void testIt ( String actual ) {
    assertThat(actual, is(equalTo(expected)));
}

и вызывать его из всех ваших методов тестирования.

Если и когда тест не пройден, будет более очевидно,тест не пройден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...