【发布时间】:2022-07-16 23:04:20
【问题描述】:
我在颤振中创建了一个 cubit 测试项目,它运行良好,但是当我用 mockito 编写 UI 测试用例时,它会抛出以下内容错误。 “Null”不是类型转换中“Stream”类型的子类型。如果真实对象通过,则单元测试工作正常。
我的Cubit 我的Cubit = 我的Cubit(); //真实对象与UT正常工作
MyCubit myCubit = MockMyCubit(); //模拟对象不能在 UT 上正常工作。
以前,当我没有升级我的颤振时,相同的代码正在使用 mockito。我也尝试过使用 mockito 来模拟 Stream,但它也没有用。
我的代码如下
颤动依赖项
flutter_bloc: ^8.0.1
mockito: ^5.1.0
my_cubit.dart
class MyCubit extends Cubit<int> {
MyCubit() : super(0);
void increment() {
emit(state + 1);
}
void decrement() {
emit(state - 1);
}
}
main.dart
void main() {
MyCubit myCubit = MyCubit();
runApp(MyAppParent(myCubit));
}
class MyAppParent extends StatelessWidget {
MyAppParent(this.myCubit);
MyCubit myCubit;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('test'),
),
body: BlocProvider<MyCubit>(
create: (_) => myCubit,
child: MyApp(),
),
),
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
MyCubit myCubit = context.read<MyCubit>();
return Column(
children: [
BlocBuilder<MyCubit, int>(bloc: myCubit, builder: (BuildContext context, int count) {
return Text('$count');
}),
TextButton(
onPressed: () {
myCubit.increment();
},
child: const Text('Increment'),
),
TextButton(
onPressed: () {
myCubit.decrement();
},
child: const Text('Decrement'),
)
],
);
}
}
widget_test.dart
class MockedMyCubit extends Mock implements MyCubit {}
void main() {
testWidgets('Testing', (WidgetTester tester) async {
MyCubit myCubit = MockMyCubit(); //fake object is not working, throwing exception
// when(myCubit.stream).thenAnswer((_) => StreamController<int>.broadcast().stream);
// MyCubit myCubit = MyCubit(); //real object working fine
await tester.pumpWidget(MyAppParent(myCubit));
Finder finderCount = find.text('0');
expect(finderCount, findsOneWidget);
Finder finderIncrement = find.text('Increment');
Finder finderDecrement = find.text('Decrement');
await tester.tap(finderIncrement);
await tester.pump();
Finder finderCount1 = find.text('1');
expect(finderCount1, findsOneWidget);
await tester.tap(finderDecrement);
await tester.pump();
Finder finderCount0 = find.text('0');
expect(finderCount0, findsOneWidget);
});
}
【问题讨论】:
-
你为什么要嘲笑肘?腕尺应该是最容易测试的部分......
标签: flutter dart widget-test-flutter flutter-cubit flutter-mockito