Каждый год я запускаю тесты, отличные от Android JUnit, из Eclipse. Сегодня я хотел протестировать некоторые из моих классов библиотеки Android. О, боль.Простой тест без использования API Android JUnit в Eclipse с android-maven-plugin?
У меня есть проект для Android-андроида, использующий android-maven-plugin. У меня есть исходные файлы в src/main/java
и мой (новый) модульный тест в src/test/java
. У моей POM есть соответствующие зависимости JUnit и ссылки на android-maven-plugin.
Иногда я создаю экземпляр для Android Uri
из File
. Иногда у меня есть существующий Java URI
экземпляр, который я создал из File
, который затем конвертирую в Uri
. Поскольку я не доверяю ни Java, ни Android с файлами и URI (не заставляйте меня начинать с того, как Java управляет путями UNC в URI или как Java нарушает договор equals()
в URI), я хотел создать простой модульный тест для создания временного файл, создайте Uris
из двух разных подходов и убедитесь, что они равны.
Итак, я делаю небольшое тестовое тестирование JUnit, как я привык, и попытаюсь запустить его в Eclipse, используя Ctrl+F11
. Eclipse спрашивает меня, является ли это «Android JUnit Test» или «JUnit Test». Ну, Android, очевидно. Поэтому я выбираю первый вариант и получаю:
[2013-03-23 21:37:10 - mylib] ------------------------------
[2013-03-23 21:37:10 - mylib] Android Launch!
[2013-03-23 21:37:10 - mylib] adb is running normally.
[2013-03-23 21:37:10 - mylib] Could not find mylib.apk!
Хммм ... это было не очень удачным. Поэтому я удаляю конфигурацию запуска и пытаюсь просто «JUnit Test». Теперь я получаю другой диалог, прося меня выбрать мою привилегированную пусковую установку «Android JUnit Test Launcher» или «Eclipse JUnit Test Launcher». Неважно, что я выбираю; Я получаю:
Class not found com.example.MyUnitTest
java.lang.ClassNotFoundException: com.example.MyUnitTest
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.java:693)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.java:429)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Я читал, что с андроид-Maven-плагин я могу запустить юнит-тесты локально в Eclipse, если они просто использовать классы в Android банку, но не делают никаких API вызовов, который что я здесь делаю. Так как я могу снять это?
И, что еще хуже, я больше не могу запускать приложение, которое зависит от этой библиотеки, поскольку Eclipse/Android жалуется, что в сгенерированных файлах Dex имеется несколько вхождений JUnit/Hamcrest. Поэтому мне нужно вырвать зависимости JUnit из POM и прокомментировать любые аннотации или вызовы, связанные с JUnit, из тестовых файлов. –
P.S. Разумеется, причина, по которой я создал этот тест для начала, заключалась в том, чтобы увидеть, создают ли Android и Java одинаковые типы URI из файлов. Nope: один использует 'file: ///', а другой использует 'файл: /'. Sheesh --- почему люди не могут заставить простейшие вещи работать последовательно? –
Просто, чтобы обратить ваше внимание на эту часть файла File.toURI() javadoc: «URI зависит от системы и не может быть передан между различными операционными/файловыми системами». – ben75