От bytes.com :
класс Преобразования разработан для преобразования широкого спектра Типов, таким образом, можно преобразовать больше типов в Десятичное число, чем Вы можете с Десятичным числом. Синтаксический анализ, который может только иметь дело со Строкой. С другой стороны, Десятичное число. Синтаксический анализ позволяет Вам определять NumberStyle.
Десятичное число и десятичное число являются псевдонимами и равны.
Для Преобразования. ToDecimal (строка), Десятичное число. Синтаксический анализ называют внутренне.
Morten Wennevik [MVP C#]
Начиная с Десятичного числа. Синтаксический анализ называет внутренне Преобразование. ToDecimal, если Вы имеете экстремальное значение требования к производительности, Вы могли бы хотеть придерживаться Десятичного числа. Синтаксический анализ, это сохранит стековый фрейм.
Вы правы, издеваться над 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!
Можно объединить все тесты в один класс. Полсекунды для компиляции и т. Д. Тогда являются константой для данного набора тестов, я полагаю, реальное время тестирования для теста незначительно.