Учитывая строку формата (String.format()/Formatter), есть ли простой способ получить ожидаемые типы аргументов?

Я работаю над некоторыми модульными тестами для локализации в нашем приложении для Android. Прямо сейчас мой модульный тест проверяет все наши разные строки формата для всех наших разных локалей, чтобы убедиться, что переводчики не испортили их (что они обычно и делают). В основном я уверен, что вызов String.format() не вызовет исключение формата.

Единственным недостатком является то, что мне нужно вручную добавлять каждую строку в тест. Я работаю над тестом замены, который использует отражение, чтобы найти каждую строку в R.string. Получить строки не проблема, но есть ли простой способ определить количество и типы аргументов, ожидаемых строкой формата?

String.format() не жалуется, если вы передаете слишком много аргументов, поэтому я, вероятно, мог бы просто передать большой массив целых чисел (который может быть распакован в %d или toString() в %s) и искать исключения формата . Тем не менее, было бы немного лучше, если бы я мог передавать правильные типы аргументов в правильных количествах :)


person Cam Saul    schedule 30.08.2012    source источник
comment
На этот случай в FindBugs есть полезный чекер.   -  person bestsss    schedule 30.08.2012
comment
Все строки формата определены в различных файлах Android XML, поэтому я не думаю, что FindBugs может мне помочь в этом случае.   -  person Cam Saul    schedule 30.08.2012


Ответы (1)


Честно говоря, я думаю, что метод проверки Exception — лучший из всех, с которыми вы столкнетесь, не используя собственный полноценный анализатор.

Если вы серьезно заинтересованы в написании кода, чтобы найти все элементы (которые будут аргументами) из метод format(...) из Formatter.java (я не могу найти привязку, так что вам просто нужно нажать control+f format(Lo, и вы Найди это). Этот код также доступен в SDK в разделе sources\android-16\java\util в закрытом методе doFormat.

На самом деле это относительно простой код, если вы изучите методы, которые он использует для поиска каждого раздела и его разбора. Я думаю, немного поработав и, возможно, немного скопировав-вставив из Formatter, вы могли бы настроить свой собственный код, который просто находил бы элементы String вместо их замены.

person Eric    schedule 30.08.2012
comment
Спасибо. Я боялся, что это будет единственный способ сделать это. Я думаю, что реализация моего собственного синтаксического анализатора на основе Formatter будет излишним для простого модульного теста, над которым я работаю, поэтому я собираюсь придерживаться проверки исключений. Я действительно заинтересован только в том, чтобы приложение не зависало на каком-то случайном языке в процессе производства. - person Cam Saul; 30.08.2012
comment
Все должно быть в порядке, если все ваши локали имеют предоставленные им строки. Я бы просто предложил выбрать строку по умолчанию в случае, если какая-то строка вызывает исключение. - person Eric; 30.08.2012
comment
У нас есть все строки в strings.xml, поэтому, если одна из них отсутствует для данной локали, она просто вернется к этому значению. Но выбор строки по умолчанию при возникновении исключения — действительно хорошая идея. Спасибо! - person Cam Saul; 30.08.2012