【问题标题】:Can dart Mockito mock abstract classes?dart Mockito 可以模拟抽象类吗?
【发布时间】:2021-06-18 14:50:18
【问题描述】:

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

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(使用一些虚拟实现),那么模拟成功。

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

【问题讨论】:

  • 你有没有继承自LoginService的具体类(mock类除外)?
  • @Abion47 不,现阶段纯粹是抽象的。
  • 目前我不在一个可以运行自己的测试的地方,但我的第一个怀疑是,由于您没有任何继承自抽象类的类,因此 Dart 的树-摇晃正在消除它的存在。尝试创建一个具体类,然后看看 mock_builder 是否可以在抽象类上工作。
  • @Abion47 似乎就是这样!创建一个随机的 impl 类后,它就可以工作了。也许您想将其作为“答案”提交,以便我标记它。

标签: flutter dart mockito


【解决方案1】:

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

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

使用 build_runner 生成文件;

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

【讨论】:

    【解决方案2】:

    如果example code from the mockito_builder repo 有任何指示,似乎为了构建抽象类的模拟,需要在某处对该类进行具体实现。

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

    所以理论上,你需要做的就是为你的类做一个占位符实现,代码生成就可以工作了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多