我正在尝试测试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项目中使用匕首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
我在我的应用程序中使用 Clean Architecture 模式和 MVVM 架构。所以我有用于单个操作的用例,例如 LoginUseCase、DownloadAttachmentUseCase 等。
我很好奇的是,如果我想在我的视图模型中链接多个用例,执行类似的操作,首先登录,一旦成功,下载附件。
我是否需要创建另一个单独的用例,例如 LoginAndDownloadAttachmentUseCase ?
应用程序既不在模拟器上运行,也不在真实设备上运行。我不明白原因。这是我的 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) 我读过在房间数据库中查询数据的一种方法是使用 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
我搜索并发现其他同样的问题,但我仍然无法解决操作栏中未显示的菜单项问题.我将发布我的动作条形码,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 ×6
mvvm ×2
android-architecture-components ×1
android-menu ×1
android-room ×1
build.gradle ×1
dagger-2 ×1
kotlin ×1
mockito ×1
observable ×1
rx-java2 ×1
toolbar ×1
unit-testing ×1
use-case ×1
viewmodel ×1