Intereting Posts
У менеджеров кластеров API Android Android API минимальное количество маркеров до создания кластера? Как запустить GcmListenerService на переднем плане Android, AdMob: обновление объявлений AdMob снижает частоту кадров Проблемы с прокруткой Dynamic Endless RecyclerView Как сделать listFooter недоступным для просмотра ACTION_SCREEN_ON и ACTION_SCREEN_OFF не работают? Как программно установить ширину представления Android EditText в DP (а не в пикселях) Регистрация путаницы Android GCM Может запустить эмулятор без HAXM в андроид-студии? Как работает VPN в Android и списке API? (леденец) Запись файла .json и чтение этого файла на Android Как я могу получить содержимое ресурса из статического контекста? Как использовать существующую базу данных с Android-приложением Являются ли приложения разработаны с использованием сторонних инструментов разработки мобильных приложений, приемлемых для их соответствующих рынков? Добавить новые регистры на байт-код Dalvik

Как я могу получить @BeforeClass и @AfterClass эквивалент в Junit3?

Я хочу создать резервную копию базы данных своего приложения, прежде чем заменять ее тестовым прибором. Я вынужден использовать Junit3 из-за ограничений Android, и я хочу реализовать эквивалентное поведение @BeforeClass @AfterClass.

UPDATE: теперь есть инструмент ( Junit4Android ), чтобы получить поддержку Junit4 на Android. Это немного клочья, но он должен работать.

Чтобы получить эквивалент @BeforeClass, я использовал статическую переменную и инициализировал ее во время первого запуска, как это, но мне нужно иметь возможность восстановить базу данных после запуска всех тестов. Я не могу придумать способ обнаружения, когда последний тест был запущен (так как я считаю, что нет гарантии при выполнении теста).

public class MyTest extends ActivityInstrumentationTestCase2<MainActivity> { private static boolean firstRun = true; @Override protected void setUp() { if(firstRun) { firstRun = false; setUpDatabaseFixture(); } } ... } 

Solutions Collecting From Web of "Как я могу получить @BeforeClass и @AfterClass эквивалент в Junit3?"

С сайта юнита :

Обернул метод setUp и tearDown в пакете. Это для случая, если вы хотите запустить одиночный тестовый тест TestTestClass.

 public static Test suite() { return new TestSetup(new TestSuite(YourTestClass.class)) { protected void setUp() throws Exception { System.out.println(" Global setUp "); } protected void tearDown() throws Exception { System.out.println(" Global tearDown "); } }; } 

Если вы хотите запустить только один setUp и tearDown для всего тестового теста, сделайте пакет и добавьте к нему testClass и передайте объект набора в конструкторе TestSetup. Но я думаю, что для этого не так много, и в некотором смысле это Нарушая философию Юнита.

Недавно я искал аналогичное решение. К счастью, в моем случае после выхода JVM после запуска последнего теста. Поэтому я смог добиться этого, добавив JVM-заглушку.

 // Restore database after running all tests Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { restoreDatabase(); } }); 

надеюсь это поможет.

Разве это не (элегантно с данными, поэтому вам не нужно беспокоиться о его восстановлении), для чего нужны тесты с макетными объектами ? Android поддерживает насмешливость .

Я задаю вопрос, потому что я никогда не издевался над Android.


В своем опыте и из этого сообщения в блоге , когда тесты Android превращаются в набор и запускаются с помощью InstrumentationTestRunnerActivityInstrumentationTestCase2 – это расширение ActivityTestCase, которое является расширением InstrumentationTestCase – они упорядочены по алфавиту с помощью android.test.suitebuilder.TestGrouping.SORT_BY_FULLY_QUALIFIED_NAME , так что вы можете просто восстановить DB с помощью метода, который является минимумом в алфавите из ваших тестовых имен, например:

 // underscore is low in the alphabet public void test___________Restore() { ... } 

Заметка:

Вы должны обратить внимание на унаследованные тесты, так как они не будут работать в этом порядке. Решение состоит в том, чтобы переопределить все унаследованные тесты и просто вызвать super () из переопределения. Это снова приведет к тому, что все будет выполнено в алфавитном порядке.

Пример:

 // Reusable class w only one time setup and finish. // Abstract so it is not run by itself. public abstract class Parent extends InstrumentationTestCase { @LargeTest public void test_001_Setup() { ... } @LargeTest public void test_____Finish() { ... } } /*-----------------------------------------------------------------------------*/ // These will run in order shown due to naming. // Inherited tests would not run in order shown w/o the use of overrides & supers public class Child extends Parent { @LargeTest public void test_001_Setup() { super.test_001_Setup(); } @SmallTest public void test_002_MainViewIsVisible() { ... } ... @LargeTest public void test_____Finish() { super.test_____Finish(); } } 

Я бы предложил избегать таких зависимостей, когда вам нужно знать порядок выполнения тестов. Если вам нужно только восстановить реальную базу данных, которая была заменена на setUpDatabaseFixture() вероятно, решение будет setUpDatabaseFixture() от использования setUpDatabaseFixture() . В любом случае, если вы не можете избежать зная, когда последний тест был запущен, вы можете использовать что-то вроде этого:

 ... private static final int NUMBER_OF_TESTS = 5; // count your tests here private static int sTestsRun = 0; ... protected void tearDown() throws Exception { super.tearDown(); sTestsRun += countTestCases(); if ( sTestsRun >= NUMBER_OF_TESTS ) { android.util.Log.d("tearDow", "*** Last test run ***"); } }