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

spring boot 單元測試JUnit5使用Mockito模擬Mock數(shù)據(jù)調(diào)用

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

spring boot 單元測試JUnit5使用Mockito模擬Mock數(shù)據(jù)調(diào)用

好大一批新用法,大家靜下心來好好看看吧

1. spring boot 使用 Mockito.when().thenReturn()模擬返回值

Mockito 是一種 Java mock 框架,他主要就是用來做 mock 測試的,他可以模擬任何 Spring 管理的 bean、模擬方法的返回值、模擬拋出異常…等,他同時(shí)也會(huì)記錄調(diào)用這些模擬方法的參數(shù)、調(diào)用順序,從而可以校驗(yàn)出這個(gè) mock 對(duì)象是否有被正確的順序調(diào)用,以及按照期望的參數(shù)被調(diào)用

SpringBoot 目前內(nèi)建的是 Mockito 框架

1)測試mockito.when設(shè)置固定值ID=1
/**
 * mockito.when設(shè)置固定值ID=1
 */
@Test
void mockito_1L() {
    User user = new User();
    user.setId(1L);
    // 配置userService的模擬行為,mock攔截了userService的真實(shí)行為,查詢Id=1時(shí),會(huì)模擬返回user
    Mockito.when(userService.selectById(1L)).thenReturn(user);
    JsonResult query = testUserController.query(user);
    Assertions.assertEquals(user, query.getData());
}
2)測試mockito.when_AnyLong 設(shè)置任意Long值
/**
 * 測試mockito.when_AnyLong 設(shè)置任意Long值
 */
@Test
void mockito_AnyLong() {
    User mockUser = new User();
    mockUser.setId(1L);
    mockUser.setUsername("我是mock用戶名");
    // 配置userService的模擬行為,mock攔截了userService的真實(shí)行為,查詢?nèi)我釯D時(shí),會(huì)模擬返回user
    // 打樁,會(huì)攔截userService.selectById的方法
    Mockito.when(userService.selectById(Mockito.anyLong())).thenReturn(mockUser);

    // 查詢ID=2L的
    User user1 = new User();
    user1.setId(1L);
    JsonResult query = testUserController.query(user1);
    Assertions.assertEquals(mockUser, query.getData());

    // 查詢ID=2L的
    User user2 = new User();
    user2.setId(2L);
    JsonResult query2 = testUserController.query(user2);
    Assertions.assertEquals(mockUser, query2.getData());
    // 查詢出來的結(jié)果,都是mockUser
}
3)測試mockito.when_AnyLong,測試調(diào)用多個(gè)參數(shù)的方法

當(dāng)傳入兩個(gè)參數(shù),其中一個(gè)參數(shù)采用任意參數(shù)時(shí),指定參數(shù)需要matchers來對(duì)比,比如Mcokito.eq(“123456”)文章來源地址http://www.zghlxwxcb.cn/news/detail-553074.html

/**
 * 測試mockito.when_AnyLong,測試調(diào)用多個(gè)參數(shù)的方法
 */
@Test
void mockito_AnyLong2() {
    User mockUser = new User();
    mockUser.setId(1L);
    mockUser.setUsername("我是mock用戶名");
    mockUser.setPassword("123456");
    // 當(dāng)傳入兩個(gè)參數(shù),其中一個(gè)參數(shù)采用任意參數(shù)時(shí),指定參數(shù)需要matchers來對(duì)比
    // 當(dāng)傳入任意用戶名字符串,和123456密碼時(shí),返回mock用戶,否則返回null
    Mockito.when(userService.addUser2Params(Mockito.anyString(), Mockito.eq("123456")))
        .thenReturn(mockUser);

    // controller去調(diào)用
    JsonResult jsonResult = testUserController
        .addUser2Params("xXxxXxx", mockUser.getPassword());

    User user = (User) jsonResult.getData();
    // 匹配上了,返回值與mockUser相同
    Assertions.assertEquals(mockUser, user);

    JsonResult jsonResult1 = testUserController.addUser2Params("xXxxXxx", "xX");

    User user1 = (User) jsonResult1.getData();
    // 不匹配,返回值null與mockUser就相同了
    Assertions.assertNotEquals(mockUser, user1);
}
4)測試mockito.when_any(User.class) 設(shè)置對(duì)象
/**
 * 測試mockito.when_any(User.class) 設(shè)置對(duì)象
 */
@Test
void mockito_AnyClass() {
    // 打樁,攔截userService.addUserSynchronizedGood方法,傳入任意User對(duì)象,都會(huì)返回true
    Mockito.when(userService.addUserSynchronizedGood(Mockito.any(User.class)))
            .thenReturn(true);

    // 增加good1
    User user1 = new User();
    user1.setId(1L);
    user1.setUsername("good1");
    JsonResult add1 = testUserController.addUserSynchronizedGood(user1);
    Assertions.assertEquals(true, add1.getData());

    // 增加good2
    User user2 = new User();
    user2.setId(2L);
    user1.setUsername("good2");
    JsonResult add2 = testUserController.addUserSynchronizedGood(user2);
    Assertions.assertEquals(true, add2.getData());
    // 返回結(jié)果,都是mockUser
}
5)測試mockito.when_特定的對(duì)象的值
/**
 * 測試mockito.when_特定的對(duì)象的值
 */
@Test
void mockito_Object() {
    User params = new User();
    params.setUsername("good1");

    // 一旦一個(gè)參數(shù)是任意匹配,其他參數(shù)都必須是任意匹配
    // 打樁,攔截userService.addUserSynchronizedGood方法,傳入good1對(duì)象,都會(huì)返回true
    // Mockito.when(userService.addUserSynchronizedGood(Mockito.eq(params))).thenReturn(true);
    Mockito.when(userService.addUserSynchronizedGood(params)).thenReturn(true);

    // 增加good1
    User user1 = new User();
    user1.setUsername("good1");
    JsonResult add1 = testUserController.addUserSynchronizedGood(user1);
    Assertions.assertEquals(true, add1.getData());

    // 增加good2
    User user2 = new User();
    user2.setUsername("good2");
    JsonResult add2 = testUserController.addUserSynchronizedGood(user2);
    Assertions.assertNotEquals(true, add2.getData());
    // 返回結(jié)果,都是mockUser
}
2. spring boot 使用mockito.when_模擬返回異常
1)thenThrow 模擬有返回值方法的異常返回
/**
 * mockito.when_thenReturn 模擬返回異常
 */
@Test
void mockito_thenReturn() {
    User params = new User();
    params.setUsername("bad1");

    // 當(dāng)bad1時(shí),模擬拋出異常
    Mockito.when(userService.addUserSynchronizedGood(params))
            .thenThrow(new RuntimeException("bad1異常"));

    // 增加good1
    User user1 = new User();
    user1.setUsername("good1");
    JsonResult add1 = testUserController.addUserSynchronizedGood(user1);
    Assertions.assertEquals(false, add1.getData());

    // 增加bad1
    User user2 = new User();
    user2.setUsername("bad1");
    Assertions.assertThrows(RuntimeException.class,
            () -> testUserController.addUserSynchronizedGood(user2), "錯(cuò)誤了,沒有產(chǎn)生異常");
}
2)doThrow 模擬沒有返回值方法的異常返回
/**
 * mockito.doThrow().when 沒有返回值的方法模擬返回異常
 */
@Test
void mockito_toThrow() {
    User params = new User();
    params.setUsername("bad");

    // 當(dāng)userService.addUser(params),值是bad時(shí),會(huì)模擬拋出異常
    Mockito.doThrow(new RuntimeException("沒有返回值的bad異常"))
            .when(userService).addUser(params);

    // 增加bad,會(huì)有異常
    User user1 = new User();
    user1.setUsername("bad");
    Assertions.assertThrows(RuntimeException.class,
            () -> testUserController.addUser(user1), "錯(cuò)誤了,沒有產(chǎn)生異常");

    // 增加good,不會(huì)觸發(fā)異常
    User user2 = new User();
    user2.setUsername("good");
    Assertions.assertDoesNotThrow(() -> 
            testUserController.addUserSynchronizedGood(user2), "錯(cuò)誤了,產(chǎn)生異常了");
}
3. spring boot 使用 mockito_verify 校驗(yàn)驗(yàn)證
1) mockito_verify 校驗(yàn)驗(yàn)證本次測試調(diào)用過哪些方法,調(diào)用了多少次
/**
 * mockito_verify 校驗(yàn)驗(yàn)證本次測試調(diào)用過哪些方法,調(diào)用了多少次
 */
@Test
void mockito_verify() {
    userService.selectById(3L);
    userService.selectById(3L);
    userService.selectById(3L);
    // 驗(yàn)證selectById是否調(diào)用了3次
    Mockito.verify(userService, Mockito.times(3)).selectById(Mockito.eq(3L));

    User user = new User();
    user.setId(3L);
    testUserController.query(user);
    testUserController.query(user);
    testUserController.query(user);
    // 驗(yàn)證selectById是否調(diào)用了6次
    Mockito.verify(userService, Mockito.times(6)).selectById(Mockito.eq(3L));
}
2) mockito.inOrder.verify,按照順序校驗(yàn)
/**
 * mockito.inOrder.verify,按照順序校驗(yàn)
 */
@Test
void mockito_inOrder() {
    userService.selectById(1L);
    userService.selectById(3L);
    userService.selectById(2L);
    // 按順序校驗(yàn)
    InOrder inOrder = Mockito.inOrder(userService);
    // 校驗(yàn)1次1L
    inOrder.verify(userService).selectById(1L);
    // 之后調(diào)了1次3L
    inOrder.verify(userService).selectById(3L);
    // 之后又調(diào)了1次2L
    inOrder.verify(userService).selectById(2L);

}
4. 用到的TestUserController
package space.goldchen.springboot.test;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import space.goldchen.springboot.common.JsonResult;
import space.goldchen.springboot.entity.User;
import space.goldchen.springboot.service.UserService;

/**
 * 單元測試,由單元測試來驗(yàn)證測試
 *
 * @author chenzhao
 * @create 2023-05-24 17:00
 */
@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
public class TestUserController {
    private final UserService userService;

    /**
     * 新增用戶
     *
     * @param user
     * @return
     */
    @PostMapping("/add")
    public JsonResult addUserSynchronizedGood(@RequestBody User user) {
        boolean b = userService.addUserSynchronizedGood(user);
        return new JsonResult(b);
    }

    /**
     * 新增用戶,沒有加鎖的
     *
     * @param user
     * @return
     */
    @PostMapping("/addUser")
    public JsonResult addUser(@RequestBody User user) {
        userService.addUser(user);
        return new JsonResult("添加了用戶");
    }

    /**
     * 查詢用戶
     *
     * @param user
     * @return
     */
    @GetMapping("/queryById")
    public JsonResult query(@RequestBody User user) {
        User user1 = userService.selectById(user.getId());
        return new JsonResult(user1);
    }

    /**
     * 查詢用戶
     *
     * @param id
     * @return
     */
    @GetMapping("/queryById2")
    public JsonResult query2(Long id) {
        User user1 = userService.selectById(id);
        return new JsonResult(user1);
    }


    /**
     * 修改用戶
     *
     * @param user
     * @return
     */
    @PutMapping("/updateById")
    public JsonResult update(@RequestBody User user) {
        boolean b = userService.updateSelective(user);
        return new JsonResult(b);
    }


    /**
     * 刪除用戶
     *
     * @param user
     * @return
     */
    @DeleteMapping("/updateById")
    public JsonResult delete(@RequestBody User user) {
        boolean b = userService.del(user);
        return new JsonResult(b);
    }
}
5.用到的UserService
package space.goldchen.springboot.service;

import space.goldchen.springboot.entity.User;

/**
 * @author chenzhao
 * @create 2023-05-20 9:56
 */
public interface UserService {
    User selectByUsername(String username);

    User selectById(Long id);

    void addUser(User user);

    /**
     * 同步鎖,添加用戶
     * @param user
     */
    boolean addUserSynchronizedBad(User user);
    /**
     * 同步鎖,添加用戶
     * @param user
     */
    boolean addUserSynchronizedGood(User user);

    /**
     * 更新用戶
     * @param user
     * @return
     */
    boolean updateSelective(User user);

    /**
     * 刪除用戶
     * @param user
     * @return
     */
    boolean del(User user);
}

到了這里,關(guān)于spring boot 單元測試JUnit5使用Mockito模擬Mock數(shù)據(jù)調(diào)用的文章就介紹完了。如果您還想了解更多內(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)文章

  • Junit5+Mockito單元測試詳解

    Junit5+Mockito單元測試詳解

    1.宏觀層面:AIR原則 A:Automatic(自動(dòng)化) 全自動(dòng)執(zhí)行,輸出結(jié)果無需人工檢查,而是通過斷言驗(yàn)證。 I:Independent(獨(dú)立性) 分層測試,各層之間不相互依賴。 R:Repeatable(可重復(fù)) 可重復(fù)執(zhí)行,不受外部環(huán)境( 網(wǎng)絡(luò)、服務(wù)、中間件等)影響。 2.微觀層面:BCDE原則 B: Bord

    2024年01月17日
    瀏覽(33)
  • springboot項(xiàng)目使用Junit5 + mockito + jacoco 實(shí)現(xiàn)單元測試以及代碼覆蓋率檢查

    在創(chuàng)建springboot項(xiàng)目時(shí)會(huì)默認(rèn)添加spring-boot-starter-test依賴,其中已經(jīng)包含了junit、mockito依賴,根據(jù)springboot版本的不同junit和mockito的版本也會(huì)有所不同 先說一下各自功能: junit只說一點(diǎn),junt4和junit5的注解不同,使用方式略有差異,其他不贅述了,基本用法都懂。 mockito是mock的

    2023年04月23日
    瀏覽(33)
  • 單元測試-spring-boot-starter-test+junit5

    開發(fā)過程中經(jīng)常需要寫單元測試,記錄一下單元測試spring-boot-starter-test+junit5的使用 引用jar包 可以對(duì)局部函數(shù)、方法進(jìn)行調(diào)用測試 可以對(duì)API調(diào)用進(jìn)行模擬測試

    2024年01月19日
    瀏覽(25)
  • 深度揭秘JUnit5與Mockito的單元測試神秘面紗

    深度揭秘JUnit5與Mockito的單元測試神秘面紗

    在今天的學(xué)習(xí)中,我們將深入研究 JUnit 和Mockito,這是 Java 開發(fā)中最強(qiáng)大的 單元測試 工具之一。通過學(xué)習(xí)如何編寫清晰、高效的單元測試,我們將揭開單元測試的神秘面紗,助力你在項(xiàng)目中寫出更健壯的代碼。 提示: 今天的代碼是在第九天代碼的基礎(chǔ)上進(jìn)行開發(fā),我們將為

    2024年02月02日
    瀏覽(33)
  • SpringBoot 實(shí)戰(zhàn):JUnit5+MockMvc+Mockito 做好單元測試

    SpringBoot 實(shí)戰(zhàn):JUnit5+MockMvc+Mockito 做好單元測試

    因?yàn)槔^承了 spring-boot-starter-parent ,所以我們依賴的 spring-boot-starter-test 不需要寫具體的版本,可以直接集成父級(jí)的版本定義。其中, spring-boot-starter-web 是用于提供 REST API 的 web 容器, spring-boot-starter-test 可以提供各種測試框架的, spring-boot-maven-plugin 是將 SpringBoot 應(yīng)用打包為

    2024年04月15日
    瀏覽(28)
  • Spring Boot與微服務(wù)測試:JUnit和Mockito的單元和集成測試實(shí)踐

    Spring Boot與微服務(wù)測試:JUnit和Mockito的單元和集成測試實(shí)踐

    微服務(wù)架構(gòu)的流行使得測試變得更為重要。在Spring Boot應(yīng)用中,使用JUnit和Mockito進(jìn)行單元和集成測試是一種常見的實(shí)踐。本文將深入探討如何利用這兩個(gè)測試框架,確保Spring Boot微服務(wù)的可靠性和穩(wěn)定性。 單元測試 1.1 JUnit簡介 JUnit是Java中最為流行的單元測試框架之一,它提供

    2024年02月21日
    瀏覽(102)
  • spring boot 單元測試JUnit5使用MockMvc調(diào)用get請(qǐng)求,post請(qǐng)求,設(shè)置head請(qǐng)求頭,解析返回值json和字符串

    spring boot 單元測試JUnit5使用MockMvc調(diào)用get/post接口 源碼地址:https://gitcode.net/qq_39339588/springboot.git 1. 先準(zhǔn)備一份controller,一會(huì)兒供測試調(diào)用 2. MockMvc測試調(diào)用get請(qǐng)求接口 兩個(gè)注解說明 @SpringBootTest // 加測試類上,標(biāo)明是測試的類 @AutoConfigureMockMvc // 支持對(duì)MockMvc對(duì)象的注入和配置,

    2024年02月14日
    瀏覽(24)
  • JUnit 5單元測試(三)—— Mockito 模擬

    上一篇講了 JUnit 5單元測試(二)—— 斷言,書接上文開始 JUnit 5單元測試(三)—— Mockito 模擬 想象下面這幾種情況你該怎么單元測試: 1.A方法去數(shù)據(jù)庫查詢了數(shù)據(jù)進(jìn)行了一些處理,該怎么單元測試; 2.在微服務(wù)項(xiàng)目中,A方法中調(diào)用了遠(yuǎn)程微服務(wù)B方法(或者B方法還沒寫好

    2024年02月15日
    瀏覽(34)
  • Spring Cloud中Controller單元測試 Junit5 & MockMvc

    在Spring Cloud中進(jìn)行Controller的單元測試,使用Junit5和Mock。 Controller: 方式一:使用@SpringBootTest + @AutoConfigureMockMvc 方式二:使用@WebMvcTest + @ImportAutoConfiguration(RefreshAutoConfiguration.class) 解決 No Scope registered for scope name \\\'refresh\\\' 異常 注入Mockmvc方式有兩種 方式一:(@AutoConfigureMockMvc / @

    2024年02月16日
    瀏覽(21)
  • 在Spring Boot環(huán)境中使用Mockito進(jìn)行單元測試

    在Spring Boot環(huán)境中使用Mockito進(jìn)行單元測試

    Mockito是一個(gè)流行的Java mocking框架,它允許開發(fā)者以簡單直觀的方式創(chuàng)建和使用模擬對(duì)象(mocks)。Mockito特別適用于在Spring Boot環(huán)境中進(jìn)行單元測試,因?yàn)樗軌蜉p松模擬Spring應(yīng)用中的服務(wù)、存儲(chǔ)庫、客戶端和其他組件。通過使用Mockito,開發(fā)者可以模擬外部依賴,從而使單元測

    2024年03月23日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包