Существуют разные мнения о значимости тестирования частных методов, например, здесь и здесь . Я лично считаю, что это имеет смысл, вопрос в том, как это сделать правильно.
В C ++ вы можете использовать хак #define
или сделать тестовый класс другом
, в 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());
Я не у меня большой опыт обработки аннотаций, поэтому сначала я спрашиваю: