在干净架构中,主要核心是包含业务逻辑的用例层。现在在 Android 中我们将使用 case 并将其作为构造函数中的参数传递给 viewmodel。例如
class AddNoteUseCase(noteRepository:INoteRepository):IUseCase{
override fun invoke(note:Note){
noteRepository.addNote(note)
}
}
我看到两种类型的代码来传递视图模型的用例
class NoteViewModel(addNoteUseCase:AddNoteUseCase){
// usecase code
}
class NoteViewModel(addNoteUseCase:IUseCase){
// usecase code
}
如果我们采用第一种方法,那么我们就无法造假,而且将来也很难做出改变。 如果我们采用第二种方法,那么我们就可以伪造单元测试
我的问题是哪种方法会有帮助。因为有人说一种方法,因为不需要伪造用例,因为它只包含一种方法,有人说不伪造你将如何测试用例
我想说第二种变体是正确的。根据我的经验,如果你有一个基本用例类/接口,通常它看起来像这样:
interface UseCase<I, O> {
suspend operator fun invoke(param: I): O
}
假设你有一个子类
AddNoteUseCase
:
class AddNoteUseCase : UseCase<Note, Unit> {
override suspend operator fun invoke(param: Note) {}
}
如果您以这种方式将此用例作为参数传递给VM:
class ViewModel(
val addNoteUseCase: UseCase<Note, Unit>
) {
}
它仍然使您的代码可读(因为您通过名称了解该用例的作用)和可测试(因为您可以在单元测试中通过您想要的任何实现)。恕我直言,没有必要为每个用例创建单独的抽象,因为它们都具有相同的接口 - 一个公共方法调用,仅此而已