Kotlin androidTest: тесты закончились. Пустой набор тестов

Я пытаюсь перевести мои тесты с java на kotlin.

Простые модульные тесты были успешно переведены следующим образом:

class BindingUtilsTest { @Test @Throws(Exception::class) fun testConvertBooleanToVisibility_visible() { assertEquals(BindingUtils.convertBooleanToVisibility(true), View.VISIBLE) } } 

Но когда я пытаюсь запустить androidTest, он терпит неудачу с сообщением: «Никаких тестов не было найдено» и

Начался запуск теста
Испытания закончились.

Пустой набор тестов.

Код работал отлично, когда был в java. Связанный код:

build.gradle parts:

 apply plugin: "com.android.application" apply plugin: "com.neenbedankt.android-apt" // for tests apply plugin: 'kotlin-android' // defaultConfig testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" sourceSets { test.java.srcDirs += 'src/test/kotlin' // tests are there androidTest.java.srcDirs += 'src/androidTest/kotlin' // and there } // unit tests testApt "com.google.dagger:dagger-compiler:${daggerVer}" // kotlin testCompile "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVer}" testCompile "org.jetbrains.kotlin:kotlin-test-junit:${kotlinVer}" // android tests androidTestApt "com.google.dagger:dagger-compiler:${daggerVer}" // kotlin androidTestCompile "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVer}" androidTestCompile "org.jetbrains.kotlin:kotlin-test-junit:${kotlinVer}" 

Простой тест:

 @RunWith(AndroidJUnit4::class) class MainDrawerActivityTest { private val mQuestions = InstrumentationRegistry.getTargetContext().applicationContext as Questions private val mTestComponentRule = TestComponentRule<Questions, AppComponentTest>(mQuestions, DaggerAppComponentTest.builder().appModuleTest(AppModuleTest(mQuestions)).build(), { obj, component -> obj.setAppComponent(component) }, // set test component { objectToClear -> objectToClear.setAppComponent(null) }) // clear test component private val mActivityTestRule = ActivityTestRule( MainDrawerActivity::class.java, false, false) // TestComponentRule needs to go first to make sure the Dagger TestComponent is set // in the Application before any Activity is launched. @Rule @JvmField val mRuleChain: TestRule = RuleChain.outerRule(mTestComponentRule).around(mActivityTestRule) private var mActivity: MainDrawerActivity? = null @Before @Throws(Exception::class) fun setUp() { mActivityTestRule.launchActivity(null) mActivity = mActivityTestRule.activity } @Test @Throws(Exception::class) fun testOnCreate() { val size = mActivity!!.supportFragmentManager.fragments.size // check if fragment instantly added assertEquals(size.toLong(), 1) } } 

Контрольный компонент находится в Котлине:

 // Empty because extends ApplicationComponent @Singleton @Component(modules = arrayOf( AppModuleTest::class)) interface AppComponentTest : AppComponent 

И тестовый модуль также находится в Котлине:

 @Module class AppModuleTest(private val mApp: Questions) /*: AppModule*/ { @Provides fun provideApp(): Questions { return mApp } } 

Я даже не вижу, что DaggerAppComponentTest построен.

Почему я использую apt вместо kapt для тестов?

Поскольку у меня есть ошибка, я не могу смешивать apt и kapt в одном проекте. Я попытался переключиться на kapt и получил миллиард ошибок.

Насколько я понимаю, kapt обрабатывает файлы kotlin и используя его, люди генерируют код kotlin? А для apt: java-файлов, java-код. Как его смешивать? Как решить эту проблему?

Решение

Принятое решение работает. До этого я вернулся к Котлину. С помощью kaptAndroidTest и kaptTest .

    + Изменить

     @Rule @JvmField val mRuleChain: TestRule = RuleChain.outerRule(mTestComponentRule).around(mActivityTestRule) 

    в

     @get:Rule @JvmField var mRuleChain: TestRule = RuleChain.outerRule(mTestComponentRule).around(mActivityTestRule) 

    если он не будет работать, это означает, что mRuleChain имеет значение NULL, проверьте объекты, предоставленные кинжалом.