Как избежать дублирования кода в тестовом приложении Android?

#android #unit-testing #testing #reflection #junit

#Android #модульное тестирование #тестирование #отражение #junit

Вопрос:

Предположим, у меня есть приложение, в котором есть похожие кнопки с именами button0, button1 и т. Д., Вплоть до button9.

Как я могу сделать следующее, не дублируя код?

 button0 = (Button) activity.findViewById(com.sample.SampleApp.R.id.button0);
button1 = (Button) activity.findViewById(com.sample.SampleApp.R.id.button1);
...
button9 = (Button) activity.findViewById(com.sample.SampleApp.R.id.button9);
  

Я пытался использовать отражение, но код выглядит нечистым.

 for (int i = 0; i <= 9; i  ) {
    String btnName = "button"   i;
    /* do reflection stuff to link self.buttonX 
       with a reference to com.sample.SampleApp.R.id.buttonX */
}
  

Ответ №1:

Следующий код не тестировался, но попробуйте:

 Button[] buttons = new Button[]{button0, button1, button2, button3, button4, button5, button6, button7, button8, button9};
for (int i = 0; i < buttons.length, i  ) {
   buttons[i] = (Button) findViewById(getResources().getIdentifier("button"   i, "id", "com.sample.SampleApp"));
}
  

С помощью ArrayList (опять же непроверенный — просто чтобы дать вам представление о том, что я имею в виду):

 ArrayList<Button> buttons = new ArrayList<Button>();
for (int i = 0; i < 10, i  ) {
   buttons.add(new Button(this));
   buttons.get(i) = (Button) findViewById(getResources().getIdentifier("button"   i, "id", "com.sample.SampleApp"));
}
  

Комментарии:

1. Спасибо! getResources().getIdentifier() очень поможет, но есть ли способ избежать массива кнопок?

2. Я полагаю, вы могли бы немного почистить его, используя ArrayList с элементами Button, но я не думаю, что вы получите его более «чистым», чем это. Я бы хотел, чтобы мне доказали, что я ошибаюсь 🙂

3. ArrayList вообще не помог, но вы помогли мне увидеть, что мне не нужны переменные экземпляра для ссылки на элементы пользовательского интерфейса, если бы я мог создать локальную переменную для ссылки на протестированный элемент пользовательского интерфейса, найденный findViewById . Спасибо.

4. Да, теперь, когда я думаю об этом, ArrayList, вероятно, плохая идея. Я не уверен, что вы можете сделать это намного лучше, чем первое предложение.