2016-02-12 1 views
3

Я написал пользовательский номер TestRule для использования с моим набором тестов для Android. Он заполняет таблицу в базе данных, используемой тестируемым приложением. Теперь мне нужно использовать это DataRule вместе с ActivityTestRule. Могу ли я иметь два поля моего тестового класса, аннотированный с @Rule? Как я могу контролировать порядок применения правил?Использование нескольких тестов в одном тесте

фон:

Андроида API предоставляет TestRule для начала деятельности, которая является основным классом для каждого приложения с пользовательским интерфейсом. У моего приложения есть база данных, и у меня есть несколько тестов, которые требуют, чтобы база данных была предварительно заполнена некоторыми известными данными. Раньше, используя тесты на основе JUnit3, я использовал абстрактный суперкласс для централизации кода, который подготавливает базу данных, а затем я расширил этот суперкласс для разных тестовых случаев. Теперь я пытаюсь реализовать ту же логику с помощью JUnit 4. Недавно я узнал, что тестовые правила - один из способов предоставить логику, которая повторно используется в тестах, поэтому я пытаюсь переместить логику из моего суперкласса в тестовое правило. Является ли это подходящим способом для достижения моей цели?

ответ

4

Вы, конечно, можете иметь несколько @Rule полеев в одном тесте. Я не уверен, что является стандартным заказом приложения правила, или если он даже четко определен. Однако, если заказ имеет важное значение, вы можете контролировать его с помощью RuleChain , который позволяет вам определить порядок применения правил при наличии нескольких правил в тестовом примере.

От Javadoc ...

@Rule 
public RuleChain chain = RuleChain 
          .outerRule(new LoggingRule("outer rule") 
          .around(new LoggingRule("middle rule") 
          .around(new LoggingRule("inner rule"); 
+0

Спасибо. Это то, что я ищу! –

+0

«Я не уверен, что является стандартным заказом приложения правила, или если он даже четко определен». У меня есть гипотеза о том, что упорядочение определяется порядком декларации внутри класса. Я еще не проверил это. –

+0

@ Code-Apprentice, который может быть. Я просто не уверен, что JLS или JDK предоставляют гарантию того, какие поля заказа возвращаются с рефлексивного вызова по сравнению с порядком, который они объявили в источнике. Я определенно не хотел бы зависеть от этого, чтобы тестирование работало. – sisyphus

2

Если вы используете JUnit для своих тестов, что я лично рекомендую, не рекомендуется иметь несколько правил в одном файле, поскольку правило является единицей вашего теста и, как вы делаете модульные тесты, вы должны иметь только одно правило для каждого файла.

Если вам нужно создать какие-то данные перед запуском тестов, вы должны использовать @Before, а затем загрузить необходимую информацию. Подробнее об этом можно найти здесь: http://junit.sourceforge.net/javadoc/org/junit/Before.html

Если вы должны загрузить одни и те же данные в нескольких классах, я бы порекомендовал вам создать класс с вашей логикой, продлить этот класс в тестовом классе, а затем создать метод аннотируется с @ Перед вызовом вашего метода суперкласса.

Надежда, что помогает

+0

Они не являются действительно юнит-тестов. Это более функциональные или интеграционные тесты. Я все еще использую JUnit, поскольку у Android есть инструменты для инструментария. –

+0

Вижу, но действительно ли нужно иметь более одного правила внутри вашего класса? Потому что, как правило, вы должны писать отдельные тестовые файлы для каждого вида деятельности. –

+0

См. Изменение в моем вопросе для получения более подробной информации. –

 Смежные вопросы

  • Нет связанных вопросов^_^