Как записать автоматизированные модульные тесты на процессор аннотации Java?

От bytes.com :

класс Преобразования разработан для преобразования широкого спектра Типов, таким образом, можно преобразовать больше типов в Десятичное число, чем Вы можете с Десятичным числом. Синтаксический анализ, который может только иметь дело со Строкой. С другой стороны, Десятичное число. Синтаксический анализ позволяет Вам определять NumberStyle.

Десятичное число и десятичное число являются псевдонимами и равны.

Для Преобразования. ToDecimal (строка), Десятичное число. Синтаксический анализ называют внутренне.

Morten Wennevik [MVP C#]

Начиная с Десятичного числа. Синтаксический анализ называет внутренне Преобразование. ToDecimal, если Вы имеете экстремальное значение требования к производительности, Вы могли бы хотеть придерживаться Десятичного числа. Синтаксический анализ, это сохранит стековый фрейм.

26
задан Idolon 18 October 2011 в 16:01
поделиться

2 ответа

Вы правы, издеваться над API обработки аннотаций (с помощью имитационной библиотеки, такой как easymock) - это больно. Я попробовал этот подход, и он довольно быстро сломался. Вы должны настроить многие ожидания вызова методов. Тесты становятся неподдерживаемыми.

Подход к тестированию , основанный на состоянии , работал у меня достаточно хорошо. Мне пришлось реализовать части API javax.lang.model. *, Которые мне понадобились для моих тестов . (Это было всего <350 строк кода.)

Это часть теста для запуска объектов javax.lang.model. После настройки модель должна быть в том же состоянии, что и реализация компилятора Java.

DeclaredType typeArgument = declaredType(classElement("returnTypeName"));
DeclaredType validReturnType = declaredType(interfaceElement(GENERATOR_TYPE_NAME), typeArgument);
TypeParameterElement typeParameter = typeParameterElement();
ExecutableElement methodExecutableElement = Model.methodExecutableElement(name, validReturnType, typeParameter);

Статические фабричные методы определены в классе Model , реализующем классы javax.lang.model. *. Например, объявленный тип . (Все неподдерживаемые операции вызовут исключения.)

public static DeclaredType declaredType(final Element element, final TypeMirror... argumentTypes) {
    return new DeclaredType(){
        @Override public Element asElement() {
            return element;
        }
        @Override public List<? extends TypeMirror> getTypeArguments() {
            return Arrays.asList(argumentTypes);
        }
        @Override public String toString() {
            return format("DeclareTypeModel[element=%s, argumentTypes=%s]",
                    element, Arrays.toString(argumentTypes));
        }
        @Override public <R, P> R accept(TypeVisitor<R, P> v, P p) {
            return v.visitDeclared(this, p);
        }
        @Override public boolean equals(Object obj) { throw new UnsupportedOperationException(); }
        @Override public int hashCode() { throw new UnsupportedOperationException(); }

        @Override public TypeKind getKind() { throw new UnsupportedOperationException(); }
        @Override public TypeMirror getEnclosingType() { throw new UnsupportedOperationException(); }
    };
}

Остальная часть теста проверяет поведение тестируемого класса.

Method actual = new Method(environment(), methodExecutableElement);
Method expected = new Method(..);
assertEquals(expected, actual);

Вы можете посмотреть исходный код исходных кодов Quickcheck @Samples и @Iterables тесты генератора кода . (Код еще не оптимален. У класса Method есть много параметров, а класс Parameter тестируется не в собственном тесте, а как часть теста Method. Тем не менее, он должен иллюстрировать подход.)

Viel Glück!

Класс Method имеет множество параметров, а класс Parameter тестируется не в собственном тесте, а как часть теста Method. Тем не менее, это должно иллюстрировать подход.)

Viel Glück!

Класс Method имеет множество параметров, а класс Parameter тестируется не в собственном тесте, а как часть теста Method. Тем не менее, это должно иллюстрировать подход.)

Viel Glück!

9
ответ дан 28 November 2019 в 06:58
поделиться

Можно объединить все тесты в один класс. Полсекунды для компиляции и т. Д. Тогда являются константой для данного набора тестов, я полагаю, реальное время тестирования для теста незначительно.

0
ответ дан 28 November 2019 в 06:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: