Kotlin androidTest:测试运行完成。 空的测试套件

我正试图将我的测试从java转换为kotlin。

简单的unit testing翻译成功,如下所示:

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

但是,当我试图运行androidTest失败,消息:“没有测试被发现”和

测试运行开始
测试运行完成。

空的测试套件。

代码工作完美,当在Java中。 相关代码:

build.gradle部分:

 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(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) } } 

测试组件在Kotlin:

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

而测试模块也在Kotlin:

 @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代码。 如何混合? 如何解决这个问题呢?

接受的解决方案工作。 在此之前,我为Kotlin返回了Kapt。 用kaptAndroidTestkaptTest

更改

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

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

如果不起作用,则表示mRuleChain为空,检查Dagger提供的对象。