国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用 Mockito 對(duì) Flutter 代碼進(jìn)行單元測試

這篇具有很好參考價(jià)值的文章主要介紹了使用 Mockito 對(duì) Flutter 代碼進(jìn)行單元測試。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

單元測試驗(yàn)證單個(gè)方法或類是否按預(yù)期工作。它還通過在進(jìn)行新更改時(shí)確認(rèn)現(xiàn)有邏輯是否仍然有效來提高可維護(hù)性。

通常,單元測試很容易編寫,但可以在測試環(huán)境中運(yùn)行。400默認(rèn)情況下,這會(huì)在進(jìn)行網(wǎng)絡(luò)調(diào)用或 HTTP 請(qǐng)求時(shí)產(chǎn)生帶有狀態(tài)代碼的空響應(yīng)。為了解決這個(gè)問題,我們可以在每次發(fā)出 HTTP 請(qǐng)求時(shí)輕松使用 Mockito 返回虛假響應(yīng)。Mockito 有各種用例,隨著我們的進(jìn)行,我們將逐步介紹這些用例。

在本教程中,我們將演示如何使用 Mockito 來測試 Flutter 代碼。我們將學(xué)習(xí)如何生成模擬、存根數(shù)據(jù)以及對(duì)發(fā)出流的方法執(zhí)行測試。讓我們開始吧!

  • 什么是 Mockito?

  • 生成模擬和存根數(shù)據(jù)

    • 項(xiàng)目結(jié)構(gòu)概述

    • 依賴注入

  • 使用參數(shù)匹配器

  • 在 Mockito 中創(chuàng)建假貨

  • 在 Flutter 中模擬和測試流

什么是 Mockito?

Mockito 是一個(gè)眾所周知的包,它可以更輕松地生成現(xiàn)有類的假實(shí)現(xiàn)。它消除了重復(fù)編寫這些功能的壓力。此外,Mockito 有助于控制輸入,因此我們可以測試預(yù)期的結(jié)果。

假設(shè)使用 Mockito 可以更輕松地編寫單元測試,但是,如果架構(gòu)不好,模擬和編寫單元測試很容易變得復(fù)雜。

在本教程的后面,我們將學(xué)習(xí)如何將 Mockito 與模型-視圖-視圖模型 (MVVM) 模式一起使用,該模式涉及將代碼庫分成不同的可測試部分,例如視圖模型和存儲(chǔ)庫。

生成模擬和存根數(shù)據(jù)

模擬是真實(shí)類的假實(shí)現(xiàn)。它們通常用于控制測試的預(yù)期結(jié)果,或者當(dāng)真實(shí)類在測試環(huán)境中容易出錯(cuò)時(shí)。

為了更好地理解這一點(diǎn),我們將為處理發(fā)送和接收帖子的應(yīng)用程序編寫單元測試。

項(xiàng)目結(jié)構(gòu)概述

在開始之前,讓我們將所有必要的包添加到我們的項(xiàng)目中。

dependencies:
  dio: ^4.0.6 # For making HTTP requests
?
dev_dependencies:
  build_runner: ^2.2.0 # For generating code (Mocks, etc)
  mockito: ^5.2.0 # For mocking and stubbing

我們將使用 MVVM 和存儲(chǔ)庫模式,其中包括對(duì)存儲(chǔ)庫和視圖模型的測試。在 Flutter 中,將所有測試放在test文件夾中是一個(gè)很好的做法,它與文件夾的結(jié)構(gòu)非常匹配lib。

接下來,我們將通過附加到文件名來創(chuàng)建authentication_repository.dart和文件。這有助于測試運(yùn)行者找到項(xiàng)目中存在的所有測試。authentication_repository_test.dart``_test


超過 20 萬開發(fā)人員使用 LogRocket 來創(chuàng)造更好的數(shù)字體驗(yàn)了解更多 →


我們將通過創(chuàng)建一個(gè)名為AuthRepository. 顧名思義,這個(gè)類將處理我們應(yīng)用程序中的所有身份驗(yàn)證功能。之后,我們將包含一個(gè)登錄方法,該方法檢查狀態(tài)代碼是否相等200并捕獲身份驗(yàn)證時(shí)發(fā)生的任何錯(cuò)誤。

class AuthRepository {
 ?Dio dio = Dio();
?
 ?AuthRepository();
?
 ?Future<bool> login({
 ? ?required String email,
 ? ?required String password,
  }) async {
 ? ?try {
 ? ? ?final result = await dio.post(
 ? ? ? ?'<https://reqres.in/api/login>',
 ? ? ? ?data: {'email': email, 'password': password},
 ? ?  );
?
 ? ? ?if (result.statusCode != 200) {
 ? ? ? ?return false;
 ? ?  }
 ?  } on DioError catch (e) {
 ? ? ?print(e.message);
 ? ? ?return false;
 ?  }
?
 ? ?return true;
  }
?
 ?// ...
}
void main() {
 ?late AuthRepository authRepository;
?
 ?setUp(() {
 ? ?authRepository = AuthRepository();
  });
?
 ?test('Successfully logged in user', () async {
 ? ?expect(
 ? ? ?await authRepository.login(email: 'james@mail.com', password: '123456'),
 ? ? ?true,
 ?  );
  });
}

在上面的測試中,我們AuthRepository在 setup 函數(shù)中初始化了 。由于它將在每個(gè)測試和測試組之前直接在內(nèi)部運(yùn)行main,因此它將auth為每個(gè)測試或組初始化一個(gè)新的存儲(chǔ)庫。

接下來,我們將編寫一個(gè)測試,期望登錄方法返回true而不會(huì)拋出錯(cuò)誤。但是,測試仍然失敗,因?yàn)閱卧獪y試默認(rèn)不支持發(fā)出網(wǎng)絡(luò)請(qǐng)求,因此發(fā)出的登錄請(qǐng)求Dio返回狀態(tài)碼400。

為了解決這個(gè)問題,我們可以使用 Mockito 生成一個(gè)模擬類,其功能類似于Dio. 在 Mockito 中,我們通過@GenerateMocks([classes])在方法的開頭添加注釋來生成模擬main。這會(huì)通知構(gòu)建運(yùn)行器為列表中的所有類生成模擬。

@GenerateMocks([Dio, OtherClass])
void main(){
 ? ?// test for login
}

接下來,打開終端并運(yùn)行命令flutter pub run build_runner build以開始為類生成模擬。代碼生成完成后,我們將能夠通過添加Mock類名來訪問生成的模擬。

@GenerateMocks([Dio])
void main(){
 ? ? ?MockDio mockDio = MockDio()
 ? ? ?late AuthRepository authRepository;
 ? ?  ...
}

我們必須對(duì)數(shù)據(jù)進(jìn)行存根,以確保MockDio在調(diào)用登錄端點(diǎn)時(shí)返回正確的響應(yīng)數(shù)據(jù)。在 Flutter 中,存根意味著在調(diào)用 mock 方法時(shí)返回一個(gè)假對(duì)象。例如,當(dāng)測試使用 調(diào)用登錄端點(diǎn)時(shí)MockDio,我們應(yīng)該返回一個(gè)帶有狀態(tài)碼的響應(yīng)對(duì)象200。

可以使用 function 來對(duì) mock 進(jìn)行存根,該 functionwhen()可以與thenReturn,一起使用thenAnswer,或者thenThrow在我們調(diào)用 mock 方法時(shí)提供所需的值。該thenAnswer函數(shù)用于返回未來或流的方法,而thenReturn用于模擬類的普通同步方法。


// To stub any method; gives error when used for futures or stream
when(mock.method()).thenReturn(value);
?
// To stub method that return a future or stream
when(mock.method()).thenAnswer(() => futureOrStream);
?
// To stub error
when(mock.method()).thenThrow(errorObject);
?
// dart
@GenerateMocks([Dio])
void main() {
 ?MockDio mockDio = MockDio();
 ?late AuthRepository authRepository;
?
 ?setUp(() {
 ? ?authRepository = AuthRepository();
  });
?
 ?test('Successfully logged in user', () async {
 ? ?// Stubbing
 ? ?when(mockDio.post(
 ? ? ?'<https://reqres.in/api/login>',
 ? ? ?data: {'email': 'james@mail.com', 'password': '123456'},
 ?  )).thenAnswer(
 ? ?  (inv) => Future.value(Response(
 ? ? ? ?statusCode: 200,
 ? ? ? ?data: {'token': 'ASjwweiBE'},
 ? ? ? ?requestOptions: RequestOptions(path: '<https://reqres.in/api/login>'),
 ? ?  )),
 ?  );
?
 ? ?expect(
 ? ? ?await authRepository.login(email: 'james@mail.com', password: '123456'),
 ? ? ?true,
 ?  );
  });
}

創(chuàng)建存根后,我們?nèi)匀恍枰獋魅隡ockDio測試文件,以便使用它而不是真正的dio類。為了實(shí)現(xiàn)這一點(diǎn),我們將從中刪除真實(shí)dio類的定義或?qū)嵗?,authRepository并允許它通過其構(gòu)造函數(shù)傳遞。這個(gè)概念稱為依賴注入。

依賴注入

Flutter 中的依賴注入是一種技術(shù),其中一個(gè)對(duì)象或類提供另一個(gè)對(duì)象的依賴項(xiàng)。這種模式確保測試模型和視圖模型都可以定義dio它們想要使用的類型。

class AuthenticationRepository{
 ? ? ? ?Dio dio;
?
 ? ? ? ?// Instead of specifying the type of dio to be used
 ? ? ? ?// we let the test or viewmodel define it
 ? ? ? ?AuthenticationRepository(this.dio)
}
@GenerateMocks([Dio])
void main() {
 ?MockDio mockDio = MockDio();
 ?late AuthRepository authRepository;
?
 ?setUp(() {
 ? ?// we can now pass in Dio as an argument
 ? ?authRepository = AuthRepository(mockDio);
  });
}

使用參數(shù)匹配器

在前面的登錄示例中,如果在發(fā)出請(qǐng)求時(shí)james@mail.com更改了電子郵件sam@mail.com,則測試將產(chǎn)生no stub found錯(cuò)誤。這是因?yàn)槲覀冎粸閖ames@mail.com.

但是,在大多數(shù)情況下,我們希望通過使用 Mockito 提供的參數(shù)匹配器來避免重復(fù)不必要的邏輯。使用參數(shù)匹配器,我們可以將相同的存根用于廣泛的值而不是確切的類型。

為了更好地理解匹配參數(shù),我們將測試PostViewModel并為PostRepository. 建議使用這種方法,因?yàn)楫?dāng)我們存根時(shí),我們將返回自定義對(duì)象或模型,而不是響應(yīng)和映射。這也很容易!

首先,我們將創(chuàng)建PostModel更清晰地表示數(shù)據(jù)的 。

class PostModel {
 ?PostModel({
 ? ?required this.id,
 ? ?required this.userId,
 ? ?required this.body,
 ? ?required this.title,
  });
?
 ?final int id;
 ?final String userId;
 ?final String body;
 ?final String title;
?
 ?// implement fromJson and toJson methods for this
}

接下來,我們創(chuàng)建PostViewModel. 這用于檢索或發(fā)送數(shù)據(jù)到PostRepository. PostViewModel只是從存儲(chǔ)庫中發(fā)送和檢索數(shù)據(jù)并通知 UI 使用新數(shù)據(jù)重建。

import 'package:flutter/material.dart';
import 'package:mockito_article/models/post_model.dart';
import 'package:mockito_article/repositories/post_repository.dart';
?
class PostViewModel extends ChangeNotifier {
 ?PostRepository postRepository;
 ?bool isLoading = false;
?
 ?final Map<int, PostModel> postMap = {};
?
 ?PostViewModel(this.postRepository);
?
 ?Future<void> sharePost({
 ? ?required int userId,
 ? ?required String title,
 ? ?required String body,
  }) async {
 ? ?isLoading = true;
 ? ?await postRepository.sharePost(
 ? ? ?userId: userId,
 ? ? ?title: title,
 ? ? ?body: body,
 ?  );
?
 ? ?isLoading = false;
 ? ?notifyListeners();
  }
?
 ?Future<void> updatePost({
 ? ?required int userId,
 ? ?required int postId,
 ? ?required String body,
  }) async {
 ? ?isLoading = true;
 ? ?await postRepository.updatePost(postId, body);
?
 ? ?isLoading = false;
 ? ?notifyListeners();
  }
?
 ?Future<void> deletePost(int id) async {
 ? ?isLoading = true;
 ? ?await postRepository.deletePost(id);
?
 ? ?isLoading = false;
 ? ?notifyListeners();
  }
?
 ?Future<void> getAllPosts() async {
 ? ?isLoading = true;
 ? ?final postList = await postRepository.getAllPosts();
?
 ? ?for (var post in postList) {
 ? ? ?postMap[post.id] = post;
 ?  }
?
 ? ?isLoading = false;
 ? ?notifyListeners();
  }
}

如前所述,我們模擬依賴關(guān)系而不是我們測試的實(shí)際類。在這個(gè)例子中,我們?yōu)?. 編寫單元測試PostViewModel并模擬PostRepository. 這意味著我們將調(diào)用生成MockPostRepository類中的方法,而不是PostRepository可能引發(fā)錯(cuò)誤的方法。

Mockito 使匹配參數(shù)變得非常容易。例如,看updatePost一下PostViewModel. 它調(diào)用存儲(chǔ)庫updatePost方法,該方法只接受兩個(gè)位置參數(shù)。對(duì)于這個(gè)類方法的存根,我們可以選擇提供精確的postIdand body,或者我們可以使用anyMockito 提供的變量來保持簡單。

@GenerateMocks([PostRepository])
void main() {
  MockPostRepository mockPostRepository = MockPostRepository();
  late PostViewModel postViewModel;

  setUp(() {
    postViewModel = PostViewModel(mockPostRepository);
  });

  test('Updated post successfully', () {
    // stubbing with argument matchers and 'any'
    when(
      mockPostRepository.updatePost(any, argThat(contains('stub'))),
    ).thenAnswer(
      (inv) => Future.value(),
    );

    // This method calls the mockPostRepository update method
    postViewModel.updatePost(
      userId: 1,
      postId: 3,
      body: 'include `stub` to receive the stub',
    );

    // verify the mock repository was called
    verify(mockPostRepository.updatePost(3, 'include `stub` to receive the stub'));
  });
}

上面的存根包括any變量和argThat(matcher)函數(shù)。在 Dart 中,匹配器用于指定測試期望。我們有不同類型的匹配器適用于不同的測試用例。例如,如果對(duì)象包含相應(yīng)的值,則匹配器contains(value)返回。true

匹配位置參數(shù)和命名參數(shù)

在 Dart 中,我們也有位置參數(shù)和命名參數(shù)。在上面的示例中,方法的模擬和存根updatePost處理位置參數(shù)并使用any變量。

但是,命名參數(shù)不支持any變量,因?yàn)?Dart 沒有提供一種機(jī)制來知道元素是否用作命名參數(shù)。相反,我們anyNamed(’name’)在處理命名參數(shù)時(shí)使用該函數(shù)。

when(
  mockPostRepository.sharePost(
    body: argThat(startsWith('stub'), named: 'body'),
    postId: anyNamed('postId'),
    title: anyNamed('title'),
    userId: 3,
  ),
).thenAnswer(
  (inv) => Future.value(),
);

當(dāng)使用帶有命名參數(shù)的匹配器時(shí),我們必須提供參數(shù)的名稱以避免錯(cuò)誤。您可以在 Dart 文檔中閱讀有關(guān)匹配器的更多信息,以查看所有可能的可用選項(xiàng)。

向日葵遠(yuǎn)程控制軟件,居家辦公必備神器,支持手機(jī)控制電腦遠(yuǎn)程傳輸文件!

在 Mockito 中創(chuàng)建假貨

模擬和假貨經(jīng)常被混淆,所以讓我們快速澄清兩者之間的區(qū)別。

模擬是生成的類,允許使用參數(shù)匹配器進(jìn)行存根。然而,F(xiàn)ake 是覆蓋真實(shí)類的現(xiàn)有方法以提供更大靈活性的類,所有這些都無需使用參數(shù)匹配器。

例如,在 post 存儲(chǔ)庫中使用 fakes 而不是 mocks 將允許我們使 fake repository 功能類似于真實(shí)存儲(chǔ)庫。這是可能的,因?yàn)槲覀兡軌蚋鶕?jù)提供的值返回結(jié)果。簡單來說,當(dāng)我們調(diào)用sharePost測試時(shí),我們可以選擇保存帖子,稍后再確認(rèn)帖子是否被保存getAllPosts。

class FakePostRepository extends Fake implements PostRepository {
  Map<int, PostModel> fakePostStore = {};

  @override
  Future<PostModel> sharePost({
    int? postId,
    required int userId,
    required String title,
    required String body,
  }) async {
    final post = PostModel(
      id: postId ?? 0,
      userId: userId,
      body: body,
      title: title,
    );
    fakePostStore[postId ?? 0] = post;
    return post;
  }

  @override
  Future<void> updatePost(int postId, String body) async {
    fakePostStore[postId] = fakePostStore[postId]!.copyWith(body: body);
  }

  @override
  Future<List<PostModel>> getAllPosts() async {
    return fakePostStore.values.toList();
  }

  @override
  Future<bool> deletePost(int id) async {
    fakePostStore.remove(id);

    return true;
  }
}

更新后的測試使用fake如下所示。使用fake,我們可以一次測試所有方法。帖子在添加或共享時(shí)將獲取到存儲(chǔ)庫中的地圖。

@GenerateMocks([PostRepository])
void main() {
  FakePostRepository fakePostRepository = FakePostRepository();
  late PostViewModel postViewModel;

  setUp(() {
    postViewModel = PostViewModel(fakePostRepository);
  });

  test('Updated post successfully', () async {
    expect(postViewModel.postMap.isEmpty, true);
    const postId = 123;

    postViewModel.sharePost(
      postId: postId,
      userId: 1,
      title: 'First Post',
      body: 'My first post',
    );
    await postViewModel.getAllPosts();
    expect(postViewModel.postMap[postId]?.body, 'My first post');

    postViewModel.updatePost(
      postId: postId,
      userId: 1,
      body: 'My updated post',
    );
    await postViewModel.getAllPosts();
    expect(postViewModel.postMap[postId]?.body, 'My updated post');
  });
}

在 Flutter 中模擬和測試流

使用 Mockito 模擬和存根流與期貨非常相似,因?yàn)槲覀儗?duì)存根使用相同的語法。然而,流與期貨有很大不同,因?yàn)樗鼈兲峁┝艘环N機(jī)制,可以在發(fā)出值時(shí)持續(xù)監(jiān)聽它們。

要測試返回流的方法,我們可以測試該方法是否被調(diào)用或檢查值是否以正確的順序發(fā)出。

class PostViewModel extends ChangeNotifier {
  ...
 ?PostRepository postRepository;
 ?final likesStreamController = StreamController<int>();
?
 ?PostViewModel(this.postRepository);
?
  ...
 ?void listenForLikes(int postId) {
 ? ?postRepository.listenForLikes(postId).listen((likes) {
 ? ? ?likesStreamController.add(likes);
 ?  });
  }
}
?
?
@GenerateMocks([PostRepository])
void main() {
 ?MockPostRepository mockPostRepository = MockPostRepository();
 ?late PostViewModel postViewModel;
?
 ?setUp(() {
 ? ?postViewModel = PostViewModel(mockPostRepository);
  });
?
 ?test('Listen for likes works correctly', () {
 ? ?final mocklikesStreamController = StreamController<int>();
?
 ? ?when(mockPostRepository.listenForLikes(any))
 ? ? ?  .thenAnswer((inv) => mocklikesStreamController.stream);
?
 ? ?postViewModel.listenForLikes(1);
?
 ? ?mocklikesStreamController.add(3);
 ? ?mocklikesStreamController.add(5);
 ? ?mocklikesStreamController.add(9);
?
 ? ?// checks if listen for likes is called
 ? ?verify(mockPostRepository.listenForLikes(1));
 ? ?expect(postViewModel.likesStreamController.stream, emitsInOrder([3, 5, 9]));
  });
}

在上面的示例中,我們添加了一個(gè)listenforLikes方法,該方法調(diào)用該P(yáng)ostRepository方法并返回一個(gè)我們可以監(jiān)聽的流。接下來,我們創(chuàng)建了一個(gè)測試來偵聽流并檢查方法是否以正確的順序被調(diào)用和發(fā)出。

對(duì)于一些復(fù)雜的情況,我們可以使用expectLaterorexpectAsync1來代替只使用expect函數(shù)。

結(jié)論

就像大多數(shù)邏輯看起來一樣簡單,編寫測試非常重要,因此我們不會(huì)重復(fù) QA 這些功能。編寫測試的目的之一是在您的應(yīng)用程序變大時(shí)減少重復(fù)的 QA。

在本文中,我們了解了如何在編寫單元測試時(shí)有效地使用 Mockito 生成模擬。我們還學(xué)習(xí)了如何使用 fakes 和參數(shù)匹配器來編寫功能測試。文章來源地址http://www.zghlxwxcb.cn/news/detail-474662.html

到了這里,關(guān)于使用 Mockito 對(duì) Flutter 代碼進(jìn)行單元測試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 搭建大型分布式服務(wù)(四十六)利用mockito不啟動(dòng)SpringBoot項(xiàng)目下進(jìn)行單元測試

    搭建大型分布式服務(wù)(四十六)利用mockito不啟動(dòng)SpringBoot項(xiàng)目下進(jìn)行單元測試

    SpringBoot支持集成Mockito做單元測試,有時(shí)候SpringBoot有很多外部依賴,在本地很難啟動(dòng)或者啟動(dòng)時(shí)間很長,而我們只想對(duì)某個(gè)方法進(jìn)行測試,需要怎樣做呢? 一、本文要點(diǎn) 接前文,我們已經(jīng)已介紹在兩種mock模式下,怎樣根據(jù)入?yún)⒎祷刈远xmock結(jié)果,但都是通過啟動(dòng)SpringBoot項(xiàng)

    2024年02月06日
    瀏覽(25)
  • Mockito單元測試基本使用

    Mockito單元測試基本使用

    本文參考: 【碼農(nóng)教程】手把手教你Mockito的使用 - 掘金 (juejin.cn) java - doReturn().when()與when().thenReturn() - 成長之路 - SegmentFault 思否 單元測試實(shí)踐篇:Mock_阿里巴巴淘系技術(shù)團(tuán)隊(duì)官網(wǎng)博客的博客-CSDN博客 阿里是如何進(jìn)行單元測試培訓(xùn)的?_Hollis Chuang的博客-CSDN博客 【Mockito】Mock

    2024年02月10日
    瀏覽(20)
  • 【單元測試】Mockito使用詳解

    【單元測試】Mockito使用詳解

    一個(gè)單元測試應(yīng)該有如下特點(diǎn): 應(yīng)該是自動(dòng)化的 應(yīng)該可以快速運(yùn)行 每個(gè)單元測試不應(yīng)該依賴其它測試的結(jié)果和執(zhí)行順序,單元測試框架可以按任意的順序執(zhí)行每個(gè)測試 每個(gè)單元測試不應(yīng)該依賴數(shù)據(jù)庫,外部文件,或者任何長時(shí)間運(yùn)行的任務(wù)。單元測試應(yīng)該是獨(dú)立的,不應(yīng)該

    2024年04月15日
    瀏覽(42)
  • 使用Mockito針對(duì)多線程場景編寫單元測試

    Mockito是一個(gè)Java的Mocking框架,主要用于編寫單元測試。針對(duì)多線程編程的單元測試,可以使用Mockito的一些特性和技巧來完成。? Mockito支持異步調(diào)用技術(shù),可以使用Mockito.when().thenReturnAsync()方法來模擬異步調(diào)用的返回值。這樣可以模擬多線程編程的情況。 例如,假設(shè)有一個(gè)異

    2024年02月09日
    瀏覽(27)
  • SpringBoot單元測試--Mockito+Junit5框架使用

    SpringBoot單元測試--Mockito+Junit5框架使用

    作為程序員為了提前發(fā)現(xiàn)代碼bug,優(yōu)化代碼; 通常我們寫完某個(gè)功能模塊代碼后都需要寫單元測試對(duì)代碼塊進(jìn)行測試(特別是敏捷開發(fā)中);Java項(xiàng)目最常用的單元測試框架即為Junit(目前最新版本為Junit5),SpringBoot本身也整合了該框架。在寫單元測試時(shí)代碼塊中的調(diào)到第三方接口方

    2024年02月02日
    瀏覽(23)
  • 單元測試?yán)鳌职咽纸棠闶褂肕ockito

    作者:京東零售 秦浩然 從你成為開發(fā)人員的那一天起,寫單元測試終究是你逃不開的宿命!那開發(fā)人員為什么不喜歡寫單元測試呢?究其原因,無外乎是依賴。依賴其他的服務(wù)、依賴運(yùn)行的環(huán)境、等等,各種依賴都成為了我們寫單元測試的絆腳石。那現(xiàn)在有個(gè)單元測試?yán)?/p>

    2024年02月08日
    瀏覽(27)
  • 使用Glib中測試框架對(duì)C代碼進(jìn)行單元測試

    使用Glib中測試框架對(duì)C代碼進(jìn)行單元測試

    C++項(xiàng)目的測試框架比較常見的是Google的 gtest (前文CMake項(xiàng)目使用ctest+gtest進(jìn)行單元測試有使用實(shí)例介紹 gtest ,感興趣的讀者可以去看看),也有一些其它框架,比如Boost中的測試框架。這些框架雖然也可以測試C代碼,但是如果在一個(gè)純C項(xiàng)目中引入這些的框架,則需要使用C+

    2023年04月22日
    瀏覽(15)
  • spring boot 單元測試JUnit5使用Mockito模擬Mock數(shù)據(jù)調(diào)用

    spring boot 單元測試JUnit5使用Mockito模擬Mock數(shù)據(jù)調(diào)用 好大一批新用法,大家靜下心來好好看看吧 1. spring boot 使用 Mockito.when().thenReturn()模擬返回值 Mockito 是一種 Java mock 框架,他主要就是用來做 mock 測試的,他可以模擬任何 Spring 管理的 bean、模擬方法的返回值、模擬拋出異常…

    2024年02月15日
    瀏覽(31)
  • 【Java應(yīng)用】使用Mockito進(jìn)行模擬和測試樁

    Mockito是一個(gè)流行的Java模擬框架,用于編寫單元測試代碼時(shí)模擬(mock)和測試樁(stub)對(duì)象的行為??奢p松模擬Java類和接口的行為,幫助測試人員和開發(fā)人員更好地設(shè)計(jì)和執(zhí)行單元測試。 使用Mockito,開發(fā)人員可以模擬一個(gè)對(duì)象,使其表現(xiàn)出某些預(yù)期的行為,而無需使用真實(shí)

    2024年02月11日
    瀏覽(18)
  • Mockito單元測試異常情況

    一、空指針異常 例子: 使用Collectors.groupingBy()進(jìn)行分組時(shí), 分組值存在null值 。 解決辦法:分組值為null時(shí),默認(rèn)值為空字符,或者讓數(shù)據(jù)不為空。 二、多個(gè)參數(shù)匹配異常 例如: 如果a和b一個(gè)是正常傳參(list、map、string…)另一個(gè)是任意萬能傳參(any()、anyList()、anyString(

    2024年02月07日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包