unit-testing - 使用相同的参数链接多个调用以返回不同的结果

标签 unit-testing dart flutter mockito

我正在编写一个包含大量单元测试的 Flutter 应用程序。
我正在使用 Mockito模拟我的类(class)。
来自 Java (Android) 世界,我可以在其中使用 Mockito 链接调用以在后续调用中返回不同的值。
我希望这能奏效。

import 'package:test/test.dart';
import 'package:mockito/mockito.dart';

void main() {
  test("some string test", () {
    StringProvider strProvider = MockStringProvider();
    when(strProvider.randomStr()).thenReturn("hello");
    when(strProvider.randomStr()).thenReturn("world");

    expect(strProvider.randomStr(), "hello");
    expect(strProvider.randomStr(), "world");
  });
}

class StringProvider {
  String randomStr() => "real implementation";
}

class MockStringProvider extends Mock implements StringProvider {}

但是它会抛出:

Expected: 'hello'
Actual:   'world'
  Which: is different.

我发现唯一有效的方法是跟踪自己。

void main() {
  test("some string test", () {
    StringProvider strProvider = MockStringProvider();

    var invocations = 0;
    when(strProvider.randomStr()).thenAnswer((_) {
      var a = '';
      if (invocations == 0) {
        a = 'hello';
      } else {
        a = 'world';
      }
      invocations++;
      return a;
    });

    expect(strProvider.randomStr(), "hello");
    expect(strProvider.randomStr(), "world");
  });
}

00:01 +1: All tests passed!

有没有更好的办法?

最佳答案

使用列表并通过 removeAt 返回答案:

import 'package:test/test.dart';
import 'package:mockito/mockito.dart';

void main() {
  test("some string test", () {
    StringProvider strProvider = MockStringProvider();
    var answers = ["hello", "world"];

    when(strProvider.randomStr()).thenAnswer((_) => answers.removeAt(0));

    expect(strProvider.randomStr(), "hello");
    expect(strProvider.randomStr(), "world");
  });
}

class StringProvider {
  String randomStr() => "real implementation";
}

class MockStringProvider extends Mock implements StringProvider {}

关于unit-testing - 使用相同的参数链接多个调用以返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53896225/

相关文章:

unit-testing - Unity 单元测试 - 注册类型

android - TextEditingController 使小部件失去其先前的状态

Flutter 的 GetIt 与后台应用程序

flutter - 相当于 Dart 中 Swift 的 if let 和 guard let

android - 返回小部件时Future Builder不运行

Flutter:textAlign:TextAlign.end 在 TextField/TextFormField 中不起作用

java - JUnit 中的 PowerMock

python - 如何使用 Bottle 框架进行单元测试

unit-testing - 有没有办法在 Flutter 单元测试中测试 AppLifecycleState 的变化?

unit-testing - 在 Dart 中,如何在单元测试中验证不抛出异常的 void 方法?