Kotlin androidTest:测试已完成.空的测试套件



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

简单的单元测试被成功翻译,如下所示:

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

测试组件在Kotlin:

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

解决方案

接受的解决方案有效。在此之前,我返回卡普特为科特林。用CCD_ 1和CCD_。

更改

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

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

如果它不起作用,则意味着mRuleChain为null,请检查Dagger提供的对象。

相关内容

  • 没有找到相关文章

最新更新