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

时间:2018-12-22 13:55:00

标签: unit-testing dart flutter mockito

我正在编写具有广泛单元测试范围的Flutter应用程序。
我正在使用Mockito来模拟我的课程。
来自JavaAndroid)世界,在这里我可以使用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:所有测试都通过!

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

使用列表并以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 {}

答案 1 :(得分:0)

在测试开始时,您不会被迫致电when

StringProvider strProvider = MockStringProvider();
when(strProvider.randomStr()).thenReturn("hello");
expect(strProvider.randomStr(), "hello");

when(strProvider.randomStr()).thenReturn("world");
expect(strProvider.randomStr(), "world");

Mockito是飞镖,其行为有所不同。后续调用会覆盖该值。