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(...);
в вашем тесте.