如何模拟未来的方法而不是获取类型'Null'不是颤振中'Future <>'类型的子类型

Posted

技术标签:

【中文标题】如何模拟未来的方法而不是获取类型\'Null\'不是颤振中\'Future <>\'类型的子类型【英文标题】:How to mock a future method and not get type 'Null' is not a subtype of type 'Future<>' in flutter如何模拟未来的方法而不是获取类型'Null'不是颤振中'Future <>'类型的子类型 【发布时间】:2021-08-01 11:02:28 【问题描述】:

我想模拟这个类和这个特定的方法

class FeedApiService extends ApiService 
  Future<FeedResponse> fetchFeed(Map<String, String> params) async 
    ...
  
  ...

我的单元测试是这样的

class FeedApiServiceMock extends Mock implements FeedApiService 
void main() 
  test('..', () 
    FeedApiServiceMock feedApiServiceMock = FeedApiServiceMock();
    when(feedApiServiceMock.fetchFeed()).thenAnswer(
        (_) => Future.value(FeedResponse(items: 1)),
      );
    expect(await feedApiServiceMock.fetchFeed().items, 1);
  );

我只是想看看 fetch feed 被正确地模拟了,但是我收到了这个错误:

type 'Null' is not a subtype of type 'Future<FeedResponse>'

【问题讨论】:

您是否启用了 null-safety?如果是这样,您现在需要使用@GenerateMocks。请参阅README.md 文件(或the NULL_SAFETY_README.md 了解更多详细信息)。 是的,我启用了 null-safety。我会试试@GenerateMocks,看看它是否能解决问题。 成功了,谢谢! 【参考方案1】:

看看在 test 和 thenAnswer 方法中添加 async 是否可以解决问题。

void main() 
  test('..', () async
    FeedApiServiceMock feedApiServiceMock = FeedApiServiceMock();
    when(feedApiServiceMock.fetchFeed()).thenAnswer(
        (_) async=> Future.value(FeedResponse(items: 1)),
      );
    expect(await feedApiServiceMock.fetchFeed().items, 1);
  );


【讨论】:

不,这不起作用,很遗憾。它给了我同样的错误。

以上是关于如何模拟未来的方法而不是获取类型'Null'不是颤振中'Future <>'类型的子类型的主要内容,如果未能解决你的问题,请参考以下文章

位类型:默认为 '0' 而不是 NULL

使用 Mocktail 测试模拟 http 客户端时,类型“Null”不是“Future<Response>”类型的子类型

如何在 SQL Server 中使用 XML 节点传递 NULL 而不是字符串格式的“NULL”值

在grails中解析JSON时如何获取真正的空值而不是JSONObject.NULL值

如何判断一个int类型是不是为空

如果请求是获取而不是发布,如何返回?