小编Ana*_*dze的帖子

ArgumentMatchers.any 不能为空

我正在尝试测试ViewModel以确保 livedata 正确更新。但是,当使用ArgumentMatchers.any()它失败时IllegalStateException说:

ArgumentMatchers.any(mViewModel.CountSubscriber::class.java) 不能为空

@Test
fun emitValueIfCountIs7() {
    doAnswer { invocation: InvocationOnMock ->
        val subscriber: mViewModel.CountSubscriber = invocation.getArgument(0)
        subscriber.onNext(7)
        null
    }.`when`(countUseCase).execute(
        ArgumentMatchers.any(mViewModel.CountSubscriber::class.java),
        ArgumentMatchers.any(Parameters::class.java)
    )
    
    // When
    mViewModel.getCount()
    
    // Verify
    assert(mViewModel.countResponse.value != null)
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Kotlin 并具有以下依赖项:

testImplementation 'junit:junit:4.12'
testImplementation "org.mockito:mockito-inline:2.23.4"
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0"
Run Code Online (Sandbox Code Playgroud)

这是我的进口:

import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.nhaarman.mockitokotlin2.doAnswer
import io.reactivex.Observable
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mockito.ArgumentMatchers.any
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations
import org.mockito.invocation.InvocationOnMock
Run Code Online (Sandbox Code Playgroud)

奇怪的是它以前可以工作,我不知道发生了什么可能会影响它。

android unit-testing mockito viewmodel kotlin

27
推荐指数
4
解决办法
1万
查看次数

lateinit属性viewModelFactory尚未在Fragment中初始化

我在我的android项目中使用匕首2(版本2.15)进行依赖项注入。除了注入viewModelFactory之外,其他一切都正常。我无法将其插入片段中。

@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

private val mainViewModel: StationsViewModel by lazy {
    ViewModelProviders.of(this, viewModelFactory)
            .get(StationsViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

lateinit property viewModelFactory has not been initialized
Run Code Online (Sandbox Code Playgroud)

我有ViewModelModule:

@Module
abstract class ViewModelModule {

    @Binds
    @IntoMap
    @ViewModelKey(MainViewModel::class)
    internal abstract fun bindsMainViewModel(mainViewModel: 
    MainViewModel): ViewModel

    @Binds
    abstract fun bindViewModelFactory(factory: MyViewModelFactory): 
    ViewModelProvider.Factory
}
Run Code Online (Sandbox Code Playgroud)

ViewModelKey

@MustBeDocumented
@Target(
        AnnotationTarget.FUNCTION,
        AnnotationTarget.PROPERTY_GETTER,
        AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class ViewModelKey(val value: KClass<out ViewModel>)
Run Code Online (Sandbox Code Playgroud)

和ViewModelFactory

@Singleton
class MyViewModelFactory @Inject constructor(
        private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
    override …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection mvvm dagger-2 android-viewmodel

7
推荐指数
1
解决办法
2439
查看次数

链接多个用例

我在我的应用程序中使用 Clean Architecture 模式和 MVVM 架构。所以我有用于单个操作的用例,例如 LoginUseCase、DownloadAttachmentUseCase 等。

我很好奇的是,如果我想在我的视图模型中链接多个用例,执行类似的操作,首先登录,一旦成功,下载附件。

我是否需要创建另一个单独的用例,例如 LoginAndDownloadAttachmentUseCase ?

android use-case mvvm clean-architecture rx-java2

6
推荐指数
2
解决办法
3926
查看次数

构建完成但应用程序未运行 - android

应用程序既不在模拟器上运行,也不在真实设备上运行。我不明白原因。这是我的 build.gradle

 apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "ge.mobility.anako.parser"
        minSdkVersion 10
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
}
Run Code Online (Sandbox Code Playgroud)

android build.gradle

5
推荐指数
1
解决办法
8977
查看次数

从后台线程查询房间数据库

我读过在房间数据库中查询数据的一种方法是使用 Livedata,它可以在主线程上使用,因为它是异步的。

我想使用 LiveData 而不是 RxJava 或 AsyncTask。

为此,在我的存储库类中,我有函数 getSomeData() 返回 LiveData> 并在我的 viewModel 构造函数中调用此函数:

private var mObservableSomeData: LiveData<List<SomeData>>

init {
    mObservableSomeData = repository.getSomeData()
}

fun getSomeData(): LiveData<List<SomeData>> {
    return mObservableSomeData
}
Run Code Online (Sandbox Code Playgroud)

但是它崩溃说:

无法访问主线程上的数据库,因为它可能会长时间锁定 UI。

我该怎么办?

android observable android-room android-livedata android-architecture-components

5
推荐指数
1
解决办法
7864
查看次数

菜单项未显示在工具栏上

我搜索并发现其他同样的问题,但我仍然无法解决操作栏中未显示的菜单项问题.我将发布我的动作条形码,menu_main.xml和MainActivity.

<?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/ColorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:elevation="10dp"
        >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="PROJECT TIMELINE"
        android:id="@+id/toolbar_title"
        android:textStyle="bold"
        android:textSize="20sp"
        android:textColor="@color/ColorPrimaryDark" />

</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)

这是来自menu_main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">


    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never" />

    <item android:id="@+id/search"
        android:title="@string/Search"
        android:icon="@drawable/ic_action"
        app:showAsAction="ifRoom"
        />

</menu>
Run Code Online (Sandbox Code Playgroud)

我在MainActivity.java中写了这个

public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

android toolbar android-menu android-actionbar

1
推荐指数
1
解决办法
4852
查看次数