Guava @VisibleForTesting: помогите мне с полным примером

Я намерен сделать unit test личных методов, и я понимаю, как импортировать @VisibleForTesting и использовать его для частного метода. Я сделал довольно много поиска, но не смог увидеть полный пример, демонстрирующий эту функцию.

Например,

class MyClass{
      @VisibleForTesting private double[] getWorkArray(double[] values,int length) {
                 :
                 :
           return <some double array> 
       }
}

Теперь в Junit я должен уметь

@Test
public void testProvateMethod(){
    MyClass object = new MyClass();
    assertNotNull(object.getWorkArray(...);
}

Но трудная часть - я не могу понять/сделать следующее a) Фрагмент плагина компилятора maven для включения соответствующего обработчика аннотаций b) На самом деле можно проверить частный метод (поскольку он вызывает ошибку, связанную с видимостью метода)

Я не могу сделать это в действии, пока я пишу тест в junit (из-за ошибки частного доступа). Например: mvn clean test

Просьба представить полный пример действительно всех шагов, связанных с получением unit test личных методов.

Ответ 1

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

Что касается @VisibleForTesting, он используется в пакетах в Guava, а не в JUnit API. Аннотирование - это всего лишь тег, указывающий, что метод может быть протестирован, он даже не загружается в JVM. Поэтому, если вам нужно протестировать непубличные методы, сделать область пакета методов, которая видна для классов unit test в том же пакете.

Наконец, при использовании отражения можно получить доступ к закрытым методам, если вам действительно нужно их протестировать.

Ответ 2

Тестирование частного метода должно быть одним из плохих шаблонов. Однако бывают случаи, когда вы часто испытываете желание проверить частные методы. В этом случае я лично использую ReflectionTestUtils для тестирования метода. Это связано с тем, что мы хотели сохранить первоначальное намерение частного метода и только проверить метод. Ниже приведен пример моего примера.

MyClass myClass = new MyClass();

ReflectionTestUtils.invokeMethod(myClass, "getWorkArray", values, length);

Один из недостатков заключается в том, что я получаю имя метода как String, и это довольно грустно, за исключением того факта, что рефакторинг неверно конвертируется в IDEA.

Надеюсь, это поможет.

Спасибо.

Ответ 3

Вы можете удалить ключевое слово private:

class MyClass{
      @VisibleForTesting double[] getWorkArray(double[] values,int length) {
                 :
                 :
           return <some double array> 
       }
}

Затем вы можете:

MyClass object = new MyClass();
assertNotNull(object.getWorkArray(...);

в вашем тесте.