颤振测试中的非空变量

Posted

技术标签:

【中文标题】颤振测试中的非空变量【英文标题】:non-null variable in flutter test 【发布时间】:2021-09-08 21:01:24 【问题描述】:

大约一年前我在学习颤振,现在休息后回来,但我反驳了一个问题,这可能很简单,但我真的不明白。

我正在关注 Flutter Clean Architecture 的教程,当我编写我的第一个测试时,我有一个错误说 “必须先分配不可为空的局部变量‘mockNumberTriviaRepository’,然后才能使用它。” 我不知道如何将其编写为正确的代码。

我的代码如下:

class MockNumberTriviaRepository extends Mock
    implements NumberTriviaRepository 

void main() 
  GetConcreteNumberTrivia usecase;
  MockNumberTriviaRepository mockNumberTriviaRepository;

  setUp(() 
    MockNumberTriviaRepository mockNumberTriviaRepository = MockNumberTriviaRepository();
    usecase = GetConcreteNumberTrivia(mockNumberTriviaRepository);
  );

  final tNumber = 1;
  final tNumberTrivia = NumberTrivia(number: 1, text: 'test');
  test('schould get trivia for the number from the repository', () async 
    // arrange
    when(**mockNumberTriviaRepository**.getConcreteNumberTrivia(1)).thenAnswer((_) async => Right(tNumberTrivia));
    // act

    // assert
  );



错误出现在测试函数中的when方法之后的** ** this符号之间

【问题讨论】:

【参考方案1】:

编译器无法真正理解您稍后会初始化该值。要告诉它您承诺在使用变量之前这样做,请在类型前添加 late 关键字。

例子:

// compiles successfully and prints 'abc'
void main() 
  late String foo;
  
  ()
    foo = 'abc';
  ();

  print(foo);

你的情况是

late MockNumberTriviaRepository mockNumberTriviaRepository;

【讨论】:

非常感谢!【参考方案2】:

在 void main 的顶部将 mockNumberTriviaRepository 初始化为

MockNumberTriviaRepository mockNumberTriviaRepository= MockNumberTriviaRepository();

class MockNumberTriviaRepository extends Mock
    implements NumberTriviaRepository 

void main() 
  GetConcreteNumberTrivia usecase;
  MockNumberTriviaRepository mockNumberTriviaRepository= MockNumberTriviaRepository();

  setUp(() 
   //MockNumberTriviaRepository mockNumberTriviaRepository = MockNumberTriviaRepository();
    usecase = GetConcreteNumberTrivia(mockNumberTriviaRepository);
  );

  final tNumber = 1;
  final tNumberTrivia = NumberTrivia(number: 1, text: 'test');
  test('schould get trivia for the number from the repository', () async 
    // arrange
    when(**mockNumberTriviaRepository**.getConcreteNumberTrivia(1)).thenAnswer((_) async => Right(tNumberTrivia));
    // act

    // assert
  );


或使用late关键字

late MockNumberTriviaRepository mockNumberTriviaRepository;

【讨论】:

以上是关于颤振测试中的非空变量的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的非空终止字符数组

jsp中el表达式的非空判断和变量赋值

jsp中el表达式的非空判断和变量赋值

Kotlin 中的非空值产生空指针异常

空循环比 C 中的非空循环慢

与其他列中的最小值关联的非空值