Dart Mockito 可以模拟抽象 类 吗?

Can dart Mockito mock abstract classes?

我正在尝试向我的 dart/flutter 库添加一些单元测试,我的被测单元的依赖项之一是抽象 class:

abstract class LoginService {
    Future<void> login(String username, String password);
}

当我将 @GenerateMocks([LoginService]) 添加到我的测试文件和 运行 build_runner 时,它失败了:

mockito:mockBuilder on test/login_test.dart:  Invalid @GenerateMocks annotation: The GenerateMocks "classes" argument is missing, includes an unknown type, or includes an extension 

但是如果我手动输入:

class MockLoginService extends Mock implements LoginService {}

没有编译错误

如果我将 LoginService 更改为不再是 abstract(使用一些虚拟实现),则模拟成功。

有什么想法吗?我检查了飞镖 Mockito 的 GitHub 问题,但找不到任何有此问题的人。

如果 example code from the mockito_builder repo 是任何迹象,似乎为了构建抽象 classes 的模拟,需要在某处具体实现 class。

我的猜测是,当 Dart 代码被编译(JIT 或其他方式)并加载到 build_runner 中时,tree-shaking 将看到抽象 class 没有实现,也没有任何其他实现任何类型的引用,因此它从编译代码中删除了 class。到 build_runner 可以做它的事情时,抽象 class 实际上已经不存在了。

所以理论上,您需要做的就是对 class 进行占位符实现,代码生成将起作用:

abstract class LoginService {
  Future<void> login(String username, String password);
}

class LoginServiceImpl extends LoginService {
  @override
  Future<void> login(String username, String password) {
    throw UnimplementedError();
  }
}

我使用 mockito 来模拟抽象存储库。例如;

@GenerateMocks([NumberTriviaRepository])
void main(){
  final mockNumberTriviaRepository = MockNumberTriviaRepository();
}

使用build_runner生成文件;

flutter packages pub run build_runner build --delete-conflicting-outputs