2016-09-09 5 views
3

Я пытаюсь перевести мои тесты с java на kotlin.Kotlin androidTest: тесты заканчивались. Пустой набор тестов

Простые модульные тесты были переведены успешно, как это:

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

Тест компонент в Котлин:

// 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.

ответ

2

Изменить

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

в

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

, если он не будет работать, то это означает, что mRuleChain равно нулю, проверьте Dagger при условии объектов.

+0

Да, эта работа для меня. Но с Realm в зависимостях я должен каждый раз очищать проект до тестов, чтобы он работал. Слишком много проблем :( –