Как я могу написать тест JUnit для частной функции, которая возвращает логическое значение? - PullRequest
1 голос
/ 27 марта 2012

Я написал тест JUnit для частной функции, которая возвращает String. И это работает нормально.

public void test2() throws Exception
{
    MyHandler handler = new MyHandler();
    Method privateStringMethod = MyHandler.class.getDeclaredMethod("getName", String.class);
    privateStringMethod.setAccessible(true);
    String s = (String) privateStringMethod.invoke(handler, 852l);
    assertNotNull(s);
}

У меня есть еще одна функция, которая возвращает логическое значение, но это не работает. Но в этом я получаю сообщение об ошибке компиляции, говорящее Cannot cast from Object to boolean.

public void test1() throws Exception
{
    MyHandler handler = new MyHandler();
    Method privateStringMethod = MyHandler.class.getDeclaredMethod("isvalid", Long.class);
    privateStringMethod.setAccessible(true);
    boolean s = (boolean) privateStringMethod.invoke(handler, 852l);
    assertNotNull(s);
}

Как мне бегать?

Ответы [ 2 ]

4 голосов
/ 27 марта 2012

Я полностью против тестирования частных методов в изоляции. Модульное тестирование должно проводиться с открытым интерфейсом класса (и, следовательно, непреднамеренно тестировать приватные методы), так как это будет рассматриваться в производственной среде.

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

0 голосов
/ 27 марта 2012

Возвращаемое значение будет автоматически помещено в логический объект. Поскольку примитив не может быть нулевым, вы не должны проверять нулевое значение. Даже .booleanValue () не должен вызываться из-за автобокса.

Но я того же мнения, что и @ alex.p, относительно тестирования частных методов.

public class Snippet {

    @Test
    public void test1() throws Exception {
        final MyHandler handler = new MyHandler();
        final Method privateStringMethod = MyHandler.class.getDeclaredMethod("isvalid");
        privateStringMethod.setAccessible(true);
        final Boolean s = (Boolean) privateStringMethod.invoke(handler);
        Assert.assertTrue(s.booleanValue());
    }

    class MyHandler {
        private boolean isvalid() {
            return false;
        }
    }
}
...