0

我在flutter中创建了一个cubit测试项目,它工作正常,但是当我用mockito编写一个UI测试用例时,它会抛出以下错误。 'Null' 不是 typecast 中类型 '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);
  }
}

主要.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);
  });
}
4

1 回答 1

0

我相信这种情况正在发生,因为模拟肘需要被告知初始状态值。在你实例化cubit之后试试这个:

when(() => myCubit.state).thenReturn(0);

于 2022-03-01T14:40:13.493 回答