Инструмент Java для тестирования частных методов?

Существуют разные мнения о значимости тестирования частных методов, например, здесь и здесь . Я лично считаю, что это имеет смысл, вопрос в том, как это сделать правильно. В 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());

Я не у меня большой опыт обработки аннотаций, поэтому сначала я спрашиваю:

  • Насколько сложно это реализовать?
  • Что я забыл?
  • Что вы думаете об этом в целом?

7
задан Community 23 May 2017 в 12:32
поделиться