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
我正在尝试向我的 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