最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mockito+PowerMock+Junit單元測試用途解析

 更新時間:2025年06月19日 09:45:25   作者:大道之簡  
本文介紹單元測試在開發(fā)和DevOps中的規(guī)范要求,詳解Mockito和PowerMock的使用,包括解耦依賴、模擬行為、驗證調(diào)用及參數(shù)匹配,同時說明SpringBoot測試注解(如@MockBean)的用法,并提及IDEA插件Squaretest的自動化測試生成功能,感興趣的朋友一起看看吧

一、單元測試用途

1、日常開發(fā)團隊要求規(guī)范,需要對開發(fā)需求代碼進行單元測試并要求行覆蓋率達到要求,DevOps流水線也會開設(shè)相關(guān)門禁閥值阻斷代碼提交,一般新增代碼行覆蓋率80%左右。

二、Mock測試介紹

1、Mock是為了解決不同的單元之間由于耦合而難于開發(fā)、測試的問題。所以,Mock既能出現(xiàn)在單元測試中,也會出現(xiàn)在集成測試、系統(tǒng)測試過程中。Mock 最大的功能是幫你把單元測試的耦合分解開,如果你的代碼對另一個類或者接口有依賴,它能夠幫你模擬這些依賴,并幫你驗證所調(diào)用的依賴的行為。

2、Mock 測試就是在測試活動中,對于某些不容易構(gòu)造或者不容易獲取的比較復(fù)雜的數(shù)據(jù)/場景,用一個虛擬的對象(Mock對象)來創(chuàng)建用于測試的測試方法。

3、Mock重要作用

Mock是為了解決不同的單元之間由于耦合而難于開發(fā)、測試的問題。所以,Mock既能出現(xiàn)在單元測試中,也會出現(xiàn)在集成測試、系統(tǒng)測試過程中。

Mock 最大的功能是幫你把單元測試的耦合分解開,如果你的代碼對另一個類或者接口有依賴,它能夠幫你模擬這些依賴,并幫你驗證所調(diào)用的依賴的行為。

三、Mock測試所需依賴

 1、主要引入mockito-core/powermock-core

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>4.5.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-core</artifactId>
            <version>2.0.9</version>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>2.0.9</version>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito2</artifactId>
            <version>2.0.9</version>
            <scope>test</scope>
        </dependency>

 Mockito和PowerMock都是單元測試模擬框架,用于模擬被測試類的依賴項。Mockito基于動態(tài)代理的方式實現(xiàn),而PowerMock在Mockito基礎(chǔ)上增加了類加載器以及字節(jié)碼篡改技術(shù),使其可以實現(xiàn)對private/static/final方法的Mock 

四、Mock的核心功能

1、Mock對象創(chuàng)建

Mockito.mock(List.class); // Mock對象創(chuàng)建

public class VerifyMockExample {
    @Test
    public void testVerifyMock() {
        List<String> mockList = Mockito.mock(List.class);
        // 調(diào)用Mock對象的方法
        mockList.add("testCode");
        mockList.size();
        // 驗證mockList.add("test")是否被調(diào)用過一次
        Mockito.verify(mockList,Mockito.times(1)).add("testCode");
        // 驗證size()方法是否被調(diào)用過
        Mockito.verify(mockList,Mockito.times(1)).size();
        Assert.assertFalse(mockList.size()==1);
    }
}

verify系列方法 

Mockito.verify/Mockito.times()驗證調(diào)用次數(shù) 

·verify(mock).methodCall():驗證方法被調(diào)用

· verify(mock, times(n)).methodCall():驗證方法被調(diào)用n次

· verify(mock, never()).methodCall():驗證方法從未被調(diào)用

或者是通過注解來實現(xiàn)創(chuàng)建

    @Mock
    private UserInfoMapper mockUserInfoMapper;
    @InjectMocks
    private UserInfoServiceImpl userInfoServiceImplUnderTest;
    @Test
    public void testVerifyMock2(){
        List<String> mockList = Mockito.mock(List.class);
        mockList.add("Code1");
        mockList.add("Code2");
        // 驗證是否調(diào)用兩次
        Mockito.verify(mockList,Mockito.times(2));
    }
 // 驗證這個方法從沒有被調(diào)用過
 Mockito.verify(userMapper, Mockito.never()).getUserById(1);
 userMapper.getUserById(1);
 // 驗證這個方法至少調(diào)用了1次
 Mockito.verify(userMapper, Mockito.atLeastOnce()).getUserById(1);
 userMapper.getUserById(1);
 // 驗證當(dāng)前方法調(diào)用了2次
 Mockito.verify(userMapper, Mockito.times(2)).getUserById(1);

 Mockito.when()使用when和thenReturn方法配置Mock對象的行為

Mockito.when( 對象.方法名 ).thenReturn( 自定義結(jié)果) //當(dāng)調(diào)用了某個 Mock 對象的方法時,就回傳我們想要的自定義結(jié)果。 

thenReturn系列方法 

//當(dāng)使用任何整數(shù)值調(diào)用 userService 的 getUserById 方法時,就回傳一個名字為 I'm mock 3 的 User 對象。
Mockito.when(userService.getUserById(Mockito.anyInt)).thenReturn( newUser( 3, "I'm mock"));
//限制只有當(dāng)參數(shù)的數(shù)字是 3 時,才會回傳名字為 I'm mock 3 的 user 對象。
Mockito.when(userService.getUserById( 3)).thenReturn( newUser( 3, "I'm mock"));
//當(dāng)調(diào)用 userService 的 insertUser 方法時,不管傳進來的 user 是什么,都回傳 100。
Mockito.when(userService.insertUser(Mockito.any(User.class))).thenReturn( 100);

thenThrow系列方法 

//當(dāng)調(diào)用 userService 的 getUserById 時的參數(shù)是 8 時,拋出一個 RuntimeException。
Mockito.when(userService.getUserById( 8)).thenThrow( new RuntimeException( "mock throw exception"));
//如果方法沒有返回值的話(即方法定義為 public void myMethod {...}),要改用 doThrow 拋出 Exception。
Mockito.doThrow( new RuntimeException( "mock throw exception")).when(userService.print);

    @Test
    public void testVerifyMock3(){
        List<String> mockList = Mockito.mock(List.class);
        // 設(shè)置Mock對象的預(yù)期行為
        Mockito.when(mockList.get(0)).thenReturn("mockedValue");
        // 斷言驗證返回值
        Assert.assertEquals("mockedValue",mockList.get(0));
    }

實戰(zhàn)案例:測試一個UserInfoServiceImpl層saveUser()方法.

原始方法:

    @Transactional
    @Override
    public void saveUser(UserInfo userInfo){
        userInfoMapper.saveUser(userInfo);
    }

單元測試:

    @Test
    public void testSaveUser() {
        // Setup
        final UserInfo userInfo = new UserInfo();
        userInfo.setId(0);
        userInfo.setUserName("userName");
        userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        // Run the test
        userInfoServiceImplUnderTest.saveUser(userInfo);
        // Verify the results
        Mockito.verify(mockUserInfoMapper).saveUser(new UserInfo());
    }

原始方法:

    @Override
    public List<UserInfo> queryListByUserName(String userName) {
        return userInfoMapper.queryListByUserName(userName);
    }

 單元測試方法:

    @Test
    public void testQueryListByUserName() {
        // Setup
        final UserInfo userInfo = new UserInfo();
        userInfo.setId(0);
        userInfo.setUserName("userName");
        userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        final List<UserInfo> expectedResult = Arrays.asList(userInfo);
        // Configure UserInfoMapper.queryListByUserName(...).
        final UserInfo userInfo1 = new UserInfo();
        userInfo1.setId(0);
        userInfo1.setUserName("userName");
        userInfo1.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        userInfo1.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        final List<UserInfo> userInfos = Arrays.asList(userInfo1);
        when(mockUserInfoMapper.queryListByUserName("userName")).thenReturn(userInfos);
        // Run the test
        final List<UserInfo> result = userInfoServiceImplUnderTest.queryListByUserName("userName");
        // Verify the results
        assertThat(result).isEqualTo(expectedResult);
    }
    @Test
    public void testQueryListByUserName_UserInfoMapperReturnsNoItems() {
        // Setup
        when(mockUserInfoMapper.queryListByUserName("userName")).thenReturn(Collections.emptyList());
        // Run the test
        final List<UserInfo> result = userInfoServiceImplUnderTest.queryListByUserName("userName");
        // Verify the results
        assertThat(result).isEqualTo(Collections.emptyList());
    }

 原始方法:

    @Override
    public List<UserInfo> queryUserInfoList(String createTime, List<Integer> idList) {
        return userInfoMapper.queryListByIds(createTime,idList);
    }

 單元測試方法:

    @Test
    public void testQueryUserInfoList() {
        // Setup
        final UserInfo userInfo = new UserInfo();
        userInfo.setId(0);
        userInfo.setUserName("userName");
        userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        final List<UserInfo> expectedResult = Arrays.asList(userInfo);
        // Configure UserInfoMapper.queryListByIds(...).
        final UserInfo userInfo1 = new UserInfo();
        userInfo1.setId(0);
        userInfo1.setUserName("userName");
        userInfo1.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        userInfo1.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        final List<UserInfo> userInfos = Arrays.asList(userInfo1);
        when(mockUserInfoMapper.queryListByIds("createTime", Arrays.asList(0))).thenReturn(userInfos);
        // Run the test
        final List<UserInfo> result = userInfoServiceImplUnderTest.queryUserInfoList("createTime", Arrays.asList(0));
        // Verify the results
        assertThat(result).isEqualTo(expectedResult);
    }
    @Test
    public void testQueryUserInfoList_UserInfoMapperReturnsNoItems() {
        // Setup
        when(mockUserInfoMapper.queryListByIds("createTime", Arrays.asList(0))).thenReturn(Collections.emptyList());
        // Run the test
        final List<UserInfo> result = userInfoServiceImplUnderTest.queryUserInfoList("createTime", Arrays.asList(0));
        // Verify the results
        assertThat(result).isEqualTo(Collections.emptyList());
    }

原始方法:Controller層,MockMvc

mockMvc.perform(request):執(zhí)行一個HTTP請求,并返回ResultActions對象。
ResultActions.andExpect(expected):驗證請求的處理結(jié)果,如狀態(tài)碼、響應(yīng)體等。
ResultActions.andDo(handler):處理請求的響應(yīng),如將響應(yīng)體寫入文件等。
ResultActions.andReturn():返回已執(zhí)行請求的結(jié)果,以便直接訪問結(jié)果。
MockMvc.perform(request).andExpect(expected).andDo(handler).andReturn():鏈式調(diào)用,執(zhí)行請求、驗證結(jié)果并處理響應(yīng),返回結(jié)果。

@Slf4j
@RestController
public class UserInfoController {
    @Autowired
    private UserInfoService userInfoService;
    /**
     * 查詢?nèi)苛斜?
     * @return
     */
    @RequestMapping("/boot/query/users")
    public List<UserInfo> getUserInfoList(){
        List<UserInfo> list = userInfoService.list();
        return list;
    }
    /**
     * 保存用戶信息
     * @return
     */
    @RequestMapping("/boot/save/user")
    public String saveUser(){
        try {
            UserInfo user=new UserInfo();
            user.setUserName("MyBatis Log Free");
            userInfoService.save(user);
        } catch (Exception e) {
            log.error("save user error", e);
            throw new GlobalException("save user error");
        }
        return "success";
    }
    @RequestMapping("/boot/query/users/ids")
    public List<UserInfo> getUserInfoListIds(){
        List<Integer> list = Arrays.asList(1, 3, 5);
        String createTime="2022-09-05 15:11:21";
        List<UserInfo> userInfos = userInfoService.queryUserInfoList(createTime,list);
        return userInfos;
    }
    @RequestMapping("/boot/query/users/like")
    public List<UserInfo> getUserInfoListLike(){
        List<UserInfo> infoList = userInfoService.queryListByUserName("A");
        return infoList;
    }
    @RequestMapping("/boot/save/userinfo")
    public void saveUserInfo(){
        UserInfo userInfo = new UserInfo();
        userInfo.setId(5);
        userInfo.setUserName("Puck");
        Date startTime = new Date();
        Date endTime = new Date();
        userInfo.setCreateTime(startTime);
        userInfo.setUpdateTime(endTime);
        userInfoService.saveUser(userInfo);
    }
}

 單元測試方法如下:

@RunWith(SpringRunner.class)
@WebMvcTest(UserInfoController.class)
public class UserInfoControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private UserInfoService mockUserInfoService;
    @Test
    public void testGetUserInfoList() throws Exception {
        // Setup
        // Configure UserInfoService.list(...).
        final UserInfo userInfo = new UserInfo();
        userInfo.setId(0);
        userInfo.setUserName("MyBatis Log Free");
        userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        final List<UserInfo> userInfos = Arrays.asList(userInfo);
        when(mockUserInfoService.list()).thenReturn(userInfos);
        // Run the test
        final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users")
                        .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();
        // Verify the results
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
//        assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
    }
    @Test
    public void testGetUserInfoList_UserInfoServiceReturnsNoItems() throws Exception {
        // Setup
        when(mockUserInfoService.list()).thenReturn(Collections.emptyList());
        // Run the test
        final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users")
                        .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();
        // Verify the results
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo("[]");
    }
    @Test
    public void testSaveUser() throws Exception {
        // Setup
        when(mockUserInfoService.save(new UserInfo())).thenReturn(false);
        // Run the test
        final MockHttpServletResponse response = mockMvc.perform(get("/boot/save/user")
                        .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();
        // Verify the results
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
        verify(mockUserInfoService).save(new UserInfo());
    }
    @Test
    public void testGetUserInfoListIds() throws Exception {
        // Setup
        // Configure UserInfoService.queryUserInfoList(...).
        final UserInfo userInfo = new UserInfo();
        userInfo.setId(0);
        userInfo.setUserName("MyBatis Log Free");
        userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        final List<UserInfo> userInfos = Arrays.asList(userInfo);
        when(mockUserInfoService.queryUserInfoList("2022-09-05 15:11:21", Arrays.asList(0))).thenReturn(userInfos);
        // Run the test
        final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/ids")
                        .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();
        // Verify the results
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
    }
    @Test
    public void testGetUserInfoListIds_UserInfoServiceReturnsNoItems() throws Exception {
        // Setup
        when(mockUserInfoService.queryUserInfoList("2022-09-05 15:11:21", Arrays.asList(0)))
                .thenReturn(Collections.emptyList());
        // Run the test
        final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/ids")
                        .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();
        // Verify the results
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo("[]");
    }
    @Test
    public void testGetUserInfoListLike() throws Exception {
        // Setup
        // Configure UserInfoService.queryListByUserName(...).
        final UserInfo userInfo = new UserInfo();
        userInfo.setId(0);
        userInfo.setUserName("MyBatis Log Free");
        userInfo.setCreateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        userInfo.setUpdateTime(new GregorianCalendar(2020, Calendar.JANUARY, 1).getTime());
        final List<UserInfo> userInfos = Arrays.asList(userInfo);
        when(mockUserInfoService.queryListByUserName("A")).thenReturn(userInfos);
        // Run the test
        final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/like")
                        .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();
        // Verify the results
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
    }
    @Test
    public void testGetUserInfoListLike_UserInfoServiceReturnsNoItems() throws Exception {
        // Setup
        when(mockUserInfoService.queryListByUserName("A")).thenReturn(Collections.emptyList());
        // Run the test
        final MockHttpServletResponse response = mockMvc.perform(get("/boot/query/users/like")
                        .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();
        // Verify the results
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo("[]");
    }
    @Test
    public void testSaveUserInfo() throws Exception {
        // Setup
        // Run the test
        final MockHttpServletResponse response = mockMvc.perform(get("/boot/save/userinfo")
                        .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();
        // Verify the results
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
        assertThat(response.getContentAsString()).isEqualTo("expectedResponse");
        verify(mockUserInfoService).saveUser(new UserInfo());
    }
}

 @Mock用于模擬不屬于 Spring 上下文的對象,而@MockBean用于模擬屬于 Spring Boot 應(yīng)用程序中的 Spring 上下文的對象。@MockBean提供與 Spring Boot 測試框架的無縫集成,并允許在測試期間用模擬對象輕松替換實際 bean 

Mockito提供了多種參數(shù)匹配器(Matchers)用于更靈活的驗證和配置行為:

import static org.mockito.ArgumentMatchers.*;
when(mockRepository.findById(anyInt())).thenReturn(Optional.of(user));
verify(mockRepository).findById(eq(1));

常見的匹配器包括:

  ·any():匹配任何參數(shù)

  · anyInt():匹配任何整數(shù)參數(shù)

  · eq(value):匹配特定值

  · isNull():匹配null值

  · notNull():匹配非null值

Mock異常

Mockito.when(userMapper.getUserById(Mockito.anyInt())).thenThrow(new RuntimeException("運行時錯誤"));
Assertions.assertThrowsExactly(RuntimeException.class, () -> userMapper.getUserById(1));
// 對于沒有返回值的方法,不能使用thenThrow()來拋出異常,可以使用doThrow()來拋出異常。
Mockito.doThrow(new RuntimeException("運行時錯誤")).when(userMapper).getUserById(1);
Assertions.assertThrowsExactly(RuntimeException.class, () -> userMapper.getUserById(1));

@MockBean 是 Spring Boot 提供的注解,它用于在測試中創(chuàng)建一個 mock 對象,并將其注入到 Spring 上下文中,替換掉原來的真實 Bean。 需要使用SpringJUnit4ClassRunner.class之類的注解

@Mock: 用于代替Mockito.mock創(chuàng)建mock對象,創(chuàng)建一個Mock實例,需要基于JUnit5環(huán)境。@InjectMocks: 創(chuàng)建一個實例,其余用@Mock(或@Spy)注解創(chuàng)建的mock將被注入到用該實例中。

你要測試哪個類(如TemplateUserServiceImpl ),那么就用 @InjectMocks注解;被測試的類中通過 @Autowired注解注入了幾個,那么測試類里面就用@Mock注解創(chuàng)建幾個實例!

原始代碼:

@Service
public class TemplateUserServiceImpl implements TemplateUserService {
    @Autowired
    private NamedParameterJdbcTemplate jdbcTemplate;
    @Transactional
    @Override
    public void saveUser() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(7);
        userInfo.setUserName("Boot");
        Date startTime = new Date();
        Date endTime = new Date();
        userInfo.setCreateTime(startTime);
        userInfo.setUpdateTime(endTime);
        // JdbcTemplate的寫入datetime,使用in方式
//        String sql="insert into user_info(user_name,create_time,update_time) values(:user_name,:create_time,:update_time)";
        String sql="insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)";
        SqlParameterSource sqlParameterSource=new BeanPropertySqlParameterSource(userInfo);
//        HashMap paramMap = new HashMap<>();
//        paramMap.put("user_name",userInfo.getUserName());
//        paramMap.put("create_time",userInfo.getCreateTime());
//        paramMap.put("update_time",userInfo.getUpdateTime());
//        jdbcTemplate.update(sql,paramMap);
        jdbcTemplate.update(sql,sqlParameterSource);
    }
}

 對應(yīng)單元測試代碼:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class TemplateUserServiceImplTest {
    @Mock
    private NamedParameterJdbcTemplate mockJdbcTemplate;
    @InjectMocks
    private TemplateUserServiceImpl templateUserServiceImplUnderTest;
    @Test
    public void testSaveUser() {
        // Setup
        // Run the test
        templateUserServiceImplUnderTest.saveUser();
        // Verify the results
        verify(mockJdbcTemplate).update(
                eq("insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)"),
                any(SqlParameterSource.class));
    }
    @Test
    public void testSaveUser_NamedParameterJdbcTemplateThrowsDataAccessException() {
        // Setup
        when(mockJdbcTemplate.update(
                eq("insert into user_info(user_name,create_time,update_time) values(:userName,:createTime,:updateTime)"),
                any(SqlParameterSource.class))).thenThrow(DataAccessException.class);
        // Run the test
        assertThatThrownBy(() -> templateUserServiceImplUnderTest.saveUser()).isInstanceOf(DataAccessException.class);
    }
}

@MockBean 和 @SpyBean和@Spy以及@Mock的使用場景和區(qū)別 

五、單元測試生成插件

1、IDEA中安裝Squaretest插件使用

文件右鍵即可生成對應(yīng)單元測試,需要修改測試用例,滿足業(yè)務(wù)訴求。

2、破解插件過程 

idea版本:

下載字節(jié)碼編譯工具:jclasslib。

jclasslib下載地址 

JAR包路徑:C:\Users\Administrator\AppData\Roaming\JetBrains\IntelliJIdea2023.3\plugins\Squaretest 

 說明:不用版本的Squaretest插件的jar包名稱或許不一樣,找空間最大的那個,約15M左右的那個。

最后一步點擊保存按鈕,選擇“overwrite”時,此時一定要將idea關(guān)閉,否則會保存失敗的. 

最后破解成功,可以正常使用。

到此這篇關(guān)于Mockito+PowerMock+Junit單元測試的文章就介紹到這了,更多相關(guān)Mockito+PowerMock+Junit單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pulsar負載均衡原理及優(yōu)化方案詳解

    Pulsar負載均衡原理及優(yōu)化方案詳解

    這篇文章主要為大家介紹了Pulsar負載均衡原理及優(yōu)化方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java 字符串轉(zhuǎn)float運算 float轉(zhuǎn)字符串的方法

    Java 字符串轉(zhuǎn)float運算 float轉(zhuǎn)字符串的方法

    今天小編就為大家分享一篇Java 字符串轉(zhuǎn)float運算 float轉(zhuǎn)字符串的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java中的分布式系統(tǒng)開發(fā)基于?Zookeeper?與?Dubbo?的應(yīng)用案例解析

    Java中的分布式系統(tǒng)開發(fā)基于?Zookeeper?與?Dubbo?的應(yīng)用案例解析

    本文將通過實際案例,帶你走進基于Zookeeper與Dubbo的分布式系統(tǒng)開發(fā),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-09-09
  • Java定義泛型接口和類的方法實例分析

    Java定義泛型接口和類的方法實例分析

    這篇文章主要介紹了Java定義泛型接口和類的方法,結(jié)合實例形式分析了泛型相關(guān)概念、原理及泛型接口與類的定義實現(xiàn)方法,需要的朋友可以參考下
    2019-08-08
  • MyBatis-Plus 自定義sql語句的實現(xiàn)

    MyBatis-Plus 自定義sql語句的實現(xiàn)

    這篇文章主要介紹了MyBatis-Plus 自定義sql語句的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Springboot整合ShardingJdbc實現(xiàn)分庫分表方式

    Springboot整合ShardingJdbc實現(xiàn)分庫分表方式

    這篇文章主要介紹了Springboot整合ShardingJdbc實現(xiàn)分庫分表方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • MyBatis?在?Spring?Boot?中的實踐記錄

    MyBatis?在?Spring?Boot?中的實踐記錄

    MyBatis是持久層框架,簡化JDBC開發(fā),通過接口+XML/注解實現(xiàn)數(shù)據(jù)訪問,動態(tài)代理生成實現(xiàn)類,支持增刪改查及參數(shù)映射,配置數(shù)據(jù)庫連接與駝峰轉(zhuǎn)換,接下來通過本文給大家介紹破繭JDBC:MyBatis在Spring?Boot中的輕量實踐指南,感興趣的哦朋友一起看看吧
    2025-08-08
  • SpringCloud中的OpenFeign調(diào)用解讀

    SpringCloud中的OpenFeign調(diào)用解讀

    OpenFeign是一個顯示聲明式的WebService客戶端,使用OpenFeign能讓編寫Web Service客戶端更加簡單OpenFeign的設(shè)計宗旨式簡化Java Http客戶端的開發(fā),本文給大家介紹SpringCloud之OpenFeign調(diào)用解讀,感興趣的朋友一起看看吧
    2023-11-11
  • 詳解Java?Synchronized的實現(xiàn)原理

    詳解Java?Synchronized的實現(xiàn)原理

    談到多線程就不得不談到Synchronized,重要性不言而喻,今天主要談?wù)凷ynchronized的實現(xiàn)原理。文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-09-09
  • Java中隨機數(shù)生成的多種方式

    Java中隨機數(shù)生成的多種方式

    本文詳細介紹了Java中的隨機數(shù)生成方式,包括Math.random()、Random、ThreadLocalRandom、SecureRandom和SplittableRandom,并提供了每種方式的適用場景和最佳實踐,需要的朋友可以參考下
    2026-02-02

最新評論

福鼎市| 社会| 临颍县| 宕昌县| 安徽省| 南昌市| 安新县| 兰溪市| 宣恩县| 克什克腾旗| 囊谦县| 普安县| 叶城县| 中阳县| 资源县| 宽甸| 三门峡市| 昂仁县| 扎囊县| 永昌县| 张北县| 桃园市| 台安县| 浮山县| 涟水县| 曲阜市| 武夷山市| 昌乐县| 京山县| 内江市| 长顺县| 留坝县| 长汀县| 新疆| 清涧县| 扎兰屯市| 肃北| 定安县| 汉寿县| 张掖市| 洛宁县|