Существуют различные мнения о значимости тестирования частных методов, например, здесь и здесь . Я лично думаю, что это имеет смысл, вопрос в том, как это сделать правильно.
В C ++ вы можете использовать #define
hack или создать тестовый класс friend
, в C # есть InternalsVisibleToAttribute , но в Java мы должны либо использовать отражение или сделать их «видимыми для тестирования» и аннотировать их как таковые , чтобы прояснить намерение. Недостатки обоих должны быть вполне понятны.
Я думаю, что должно быть что-то лучше. Начиная с
public class Something {
private int internalSecret() {
return 43;
}
}
было бы неплохо иметь возможность вызывать закрытые методы в тестовом коде, например
@MakeVisibleForTesting Something something = new Something();
Assert.assertEquals(43, something.internalSecret());
Здесь аннотация молча преобразует все вызовы в частные методы something
, используя отражение. Интересно, может ли Ломбок это сделать (и спросит у авторов).
Вполне возможно, что создание такого количества магии оказывается слишком сложным, и в любом случае это займет некоторое время, поэтому я ищу какую-то альтернативу. Возможно, аннотируем тестируемый класс чем-то вроде @Decapsulate
и используем процессор аннотаций для генерации класса Decapsulated_Something
, похожего на
public class Decapsulated_Something {
public Decapsulated_Something(Something delegate) {
this.delegate = delegate
}
public boolean internalSecret() {
// call "delegate.internalSecret()" using reflection
}
...
}
, что позволило бы использовать
Decapsulated_Something something = new Decapsulated_Something(new Something());
Assert.assertEquals(43, something.internalSecret());
У меня нет большого опыта работы с аннотациями, поэтому сначала я спрашиваю:
- Насколько сложно это реализовать?
- Что я забыл?
- Что вы вообще об этом думаете?