欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot 整合 Mockito提升Java單元測試的高效實(shí)踐案例

 更新時間:2024年04月19日 11:31:34   作者:給自己一個 smile  
Mockito與Spring Boot的整合為Java開發(fā)者提供了一套完整的解決方案,使得單元測試更為精準(zhǔn)、高效,從而確保了代碼質(zhì)量、降低了維護(hù)成本,并促進(jìn)了項(xiàng)目的持續(xù)集成與交付,感興趣的朋友跟隨小編一起看看吧

引言

在Java開發(fā)領(lǐng)域,Spring Boot因其便捷的配置和強(qiáng)大的功能而受到廣泛歡迎,而Mockito作為一款成熟的單元測試模擬框架,則在提高測試質(zhì)量、確保代碼模塊間解耦方面扮演著至關(guān)重要的角色。本文將詳細(xì)介紹如何在Spring Boot項(xiàng)目中整合Mockito,以及Mockito的概念、功能點(diǎn)、優(yōu)勢及實(shí)際應(yīng)用案例。

一、Mockito概念

Mockito是一個面向Java開發(fā)者的模擬框架,它的核心目標(biāo)是**通過創(chuàng)建和配置模擬對象**(Mock Objects)來替代真實(shí)依賴項(xiàng),以便在單元測試中有效地隔離被測代碼。在Spring Boot應(yīng)用程序中,Mockito可用于模擬DAOs、Services、Repositories以及其他依賴服務(wù),使得測試僅針對單一的業(yè)務(wù)邏輯進(jìn)行驗(yàn)證,而無需啟動數(shù)據(jù)庫、網(wǎng)絡(luò)請求等實(shí)際資源。

為什么寫單元測試?

  • 驗(yàn)證功能正確性:

單元測試允許開發(fā)者針對代碼的最小可測試單元(如類、方法)逐一驗(yàn)證它們是否按預(yù)期工作,確保每個獨(dú)立組件的功能正確無誤。

  • 隔離問題定位:

當(dāng)系統(tǒng)出現(xiàn)問題時,單元測試能快速定位具體哪個模塊出現(xiàn)了故障,避免因多個模塊相互影響而導(dǎo)致的診斷困難。

  • 支持持續(xù)集成/持續(xù)部署(CI/CD):

在CI/CD流水線中,單元測試作為構(gòu)建過程的一部分,確保每次提交的新代碼都不會破壞現(xiàn)有的功能。

  • 促進(jìn)重構(gòu)和演化:

編寫了充分的單元測試后,重構(gòu)代碼時就有了安全網(wǎng),可以放心地修改內(nèi)部結(jié)構(gòu)而不必?fù)?dān)心會影響到現(xiàn)有功能。

  • 設(shè)計指導(dǎo):

TDD(測試驅(qū)動開發(fā))提倡先編寫單元測試,這有助于推動設(shè)計出更易于測試的代碼,即模塊化程度更高、依賴關(guān)系更清晰的設(shè)計。

  • 文檔作用:

單元測試實(shí)際上是另一種形式的文檔,它展示了代碼如何被預(yù)期使用,以及不同輸入下產(chǎn)生的輸出,是活生生的、可執(zhí)行的契約。

單元測試的優(yōu)點(diǎn)

  • 盡早發(fā)現(xiàn)問題:

開發(fā)階段就能發(fā)現(xiàn)潛在的缺陷,而不是等到集成測試或生產(chǎn)環(huán)境中才顯現(xiàn),節(jié)省了后期修正的成本。

  • 提升代碼質(zhì)量:

通過全面覆蓋邊界條件、異常情況和其他關(guān)鍵場景,促使開發(fā)人員考慮更多的邊緣用例,從而提高代碼的健壯性。

  • 可維護(hù)性:

有了良好的單元測試覆蓋,未來的開發(fā)人員更容易理解代碼行為,并有信心在修改代碼時不會無意中破壞既有功能。

  • 依賴管理:

使用像Mockito這樣的框架可以模擬和隔離依賴項(xiàng),使得測試關(guān)注于單個單元本身的行為,不受外部因素的影響。

  • 迭代速度:

單元測試使得開發(fā)周期更快,因?yàn)殚_發(fā)人員可以迅速驗(yàn)證他們的更改是否有效,無需每次修改后都進(jìn)行全面的手動回歸測試。

  • 信心保障:

經(jīng)過單元測試的代碼提供了額外的信心,尤其是在大型項(xiàng)目中,確保每個模塊的質(zhì)量,有助于形成穩(wěn)定的軟件整體。

一種測試手段,更是提升代碼質(zhì)量、支持敏捷開發(fā)和維護(hù)軟件長期穩(wěn)定性的有效工具。

二、Mockito功能點(diǎn)

Mock對象創(chuàng)建: 使用Mockito的mock()函數(shù)可以輕松創(chuàng)建模擬對象,例如,對于一個UserMapper接口:

UserMapper userMapper = Mockito.mock(UserMapper.class);

方法行為設(shè)置: 可以通過when()方法定義模擬對象的方法調(diào)用時的預(yù)期行為,例如設(shè)置返回值或拋出異常:

// 準(zhǔn)備測試數(shù)據(jù)和模擬行為
 when(userMapper.findUserByUsernameAndPassword(testLoginReq.getUsername(), testLoginReq.getPassword())).thenReturn(null);
// 執(zhí)行測試方法并驗(yàn)證期望的異常被拋出
Exception exception = assertThrows(RuntimeException.class, () -> userService.login(testLoginReq));

驗(yàn)證方法調(diào)用: 使用verify()函數(shù)來確保模擬對象的方法已經(jīng)被正確調(diào)用:

// Verify that the method was called with the correct parameters
verify(userMapper).findUserByUsernameAndPassword(testLoginReq.getUsername(), testLoginReq.getPassword());

參數(shù)匹配器: 提供了一系列參數(shù)匹配器,如any(), eq(), argThat()等,方便在驗(yàn)證時不需明確指定參數(shù)值:

verify(userMapper).findByEmail(argThat(email -> email.endsWith("@example.com")));

Spies: Mockito還支持創(chuàng)建Spy對象,它允許對已有真實(shí)對象進(jìn)行部分模擬,同時保留原有對象的功能:

UserService realUserService = new UserService();
UserServiceImpl userServiceSpy = Mockito.spy(UserServiceImpl);

三、Mockito優(yōu)勢

  • 隔離性:通過模擬依賴項(xiàng),避免了測試之間不必要的耦合,提高了單元測試的準(zhǔn)確性。
  • 簡潔性:Mockito API設(shè)計簡潔明了,使得編寫和維護(hù)測試代碼變得容易。
  • 深度控制:能夠精細(xì)控制模擬對象的行為,包括方法調(diào)用的順序、次數(shù)和異常處理等。
  • 文檔作用:通過模擬的交互,反映了被測試代碼對外部依賴的使用方式,起到一定的文檔作用。

四、Spring Boot整合Mockito案例

添加POM依賴

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.2</version>
    <relativePath/><!-- lookup parent from repository -->
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

業(yè)務(wù)方法

@Service
@Slf4j(topic = "UserServiceImpl")
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public LoginUserResp login(LoginUserReq loginReq) {
        log.info("loginReq:{}", loginReq);
        User user = userMapper.findUserByUsernameAndPassword(loginReq.getUsername(), loginReq.getPassword());
        if (Objects.isNull(user)) {
            throw new RuntimeException("用戶名或密碼錯誤");
        }
        LoginUserResp loginUserResp = new LoginUserResp();
        loginUserResp.setId(0L);
        loginUserResp.setUsername(user.getUsername());
        loginUserResp.setNickName(user.getNickname());
        loginUserResp.setToken("token");
        loginUserResp.setPhone("phone");
        loginUserResp.setUserType(0);
        return loginUserResp;
    }
    @Override
    public Boolean createUser(UserAddReq userAddReq) {
        log.info("userAddReq:{}", userAddReq);
        String email = userAddReq.getEmail();
        if (Objects.isNull(email)) {
            throw new RuntimeException("郵箱不能為空");
        }
        if (!email.contains("@example.com")) {
            throw new RuntimeException("郵箱格式不正確");
        }
        userMapper.insert(userAddReq);
        return Boolean.TRUE;
    }
}

UserServiceImplTest 測試類

假設(shè)我們正在測試一個UserService類,它依賴于UserMapper。在Spring Boot測試中,可以利用@Mock注解來自動創(chuàng)建并替換Spring容器中的Mock對象:

@ExtendWith(MockitoExtension.class)
public class UserServiceImplTest {
    @Mock
    private UserMapper userMapper;
    @InjectMocks
    private UserServiceImpl userService;
    private User testUser;
    private LoginUserReq testLoginReq;
    private LoginUserResp expectedLoginResp;
    private UserAddReq validUserAddReq;
    private UserAddReq invalidEmailUserAddReq;
    private UserAddReq nullEmailUserAddReq;
    @BeforeEach
    public void setUp() {
        testUser = new User();
        testUser.setId(1L);
        testUser.setUsername("testUser");
        testUser.setNickname("TestNick");
        testLoginReq = new LoginUserReq();
        testLoginReq.setUsername("testUser");
        testLoginReq.setPassword("password");
        expectedLoginResp = new LoginUserResp();
        expectedLoginResp.setId(testUser.getId());
        expectedLoginResp.setUsername(testUser.getUsername());
        expectedLoginResp.setNickName(testUser.getNickname());
        expectedLoginResp.setToken("token");
        expectedLoginResp.setPhone("phone");
        expectedLoginResp.setUserType(0);
        validUserAddReq = new UserAddReq();
        validUserAddReq.setUsername("testUser");
        validUserAddReq.setPassword("testPass");
        validUserAddReq.setEmail("test@example.com");
        invalidEmailUserAddReq = new UserAddReq();
        invalidEmailUserAddReq.setUsername("testUser");
        invalidEmailUserAddReq.setPassword("testPass");
        invalidEmailUserAddReq.setEmail("test@example");
        nullEmailUserAddReq = new UserAddReq();
        nullEmailUserAddReq.setUsername("testUser");
        nullEmailUserAddReq.setPassword("testPass");
        nullEmailUserAddReq.setEmail(null);
    }
    /**
     * 測試使用有效的憑據(jù)進(jìn)行登錄時,應(yīng)成功登錄。
     *
     * Arrange 配置測試環(huán)境:
     * 設(shè)置當(dāng)使用測試請求中的用戶名和密碼調(diào)用 userMapper.findUserByUsernameAndPassword 方法時,
     * 返回預(yù)設(shè)的測試用戶對象。
     *
     * Act 執(zhí)行動作:
     * 使用測試登錄請求調(diào)用 userService.login 方法,獲取實(shí)際的登錄響應(yīng)。
     *
     * Assert 斷言結(jié)果:
     * 驗(yàn)證實(shí)際的登錄響應(yīng)不為空,并且其各個字段(用戶名、昵稱、令牌、電話、用戶類型)與預(yù)期的登錄響應(yīng)相匹配。
     *
     * Verify 驗(yàn)證調(diào)用:
     * 驗(yàn)證 userMapper.findUserByUsernameAndPassword 方法確實(shí)被使用了正確的參數(shù)(測試請求中的用戶名和密碼)調(diào)用。
     */
    @Test
    public void whenValidCredentials_thenSuccessfulLogin() {
        // Arrange
        when(userMapper.findUserByUsernameAndPassword(testLoginReq.getUsername(), testLoginReq.getPassword())).thenReturn(testUser);
        // Act
        LoginUserResp actualLoginResp = userService.login(testLoginReq);
        // Assert
        assertNotNull(actualLoginResp);
        assertEquals(expectedLoginResp.getUsername(), actualLoginResp.getUsername());
        assertEquals(expectedLoginResp.getNickName(), actualLoginResp.getNickName());
        assertEquals(expectedLoginResp.getToken(), actualLoginResp.getToken());
        // Verify that the method was called with the correct parameters
        verify(userMapper).findUserByUsernameAndPassword(testLoginReq.getUsername(), testLoginReq.getPassword());
    }
    /**
     * 測試登錄服務(wù)時,使用無效的用戶名和密碼應(yīng)該導(dǎo)致登錄失敗。
     * 這個測試用例驗(yàn)證當(dāng)提供的用戶名和密碼不匹配任何已知用戶時,login方法是否拋出運(yùn)行時異常。
     */
    @Test
    public void whenInvalidCredentials_thenLoginFailure() {
        // 準(zhǔn)備測試數(shù)據(jù)和模擬行為
        when(userMapper.findUserByUsernameAndPassword(testLoginReq.getUsername(), testLoginReq.getPassword())).thenReturn(null);
        // 執(zhí)行測試方法并驗(yàn)證期望的異常被拋出
        Exception exception = assertThrows(RuntimeException.class, () -> userService.login(testLoginReq));
        // 驗(yàn)證拋出的異常消息是否匹配預(yù)期
        assertEquals("用戶名或密碼錯誤", exception.getMessage());
        // 驗(yàn)證userMapper的findUserByUsernameAndPassword方法是否被正確調(diào)用
        verify(userMapper).findUserByUsernameAndPassword(testLoginReq.getUsername(), testLoginReq.getPassword());
    }
    /**
     * 測試創(chuàng)建用戶功能。
     * 當(dāng)提供的用戶信息有效時,應(yīng)該成功保存用戶信息并返回true。
     */
    @Test
    public void createUser_WithValidUser_ShouldPersistAndReturnTrue() {
        // 準(zhǔn)備測試環(huán)境
        when(userMapper.insert(any(UserAddReq.class))).thenReturn(1);
        // 執(zhí)行測試動作
        Boolean result = userService.createUser(validUserAddReq);
        // 驗(yàn)證測試結(jié)果
        assertTrue(result);
        verify(userMapper).insert(validUserAddReq);
    }
}

五、異常處理與斷言

在Mockito中,可以模擬方法拋出異常,并在測試中捕獲和驗(yàn)證:

/**
     * 測試創(chuàng)建用戶時使用無效郵箱地址應(yīng)該拋出異常的情況。
     * 該測試方法不會返回任何值,它的目的是驗(yàn)證當(dāng)提供一個無效的郵箱地址時,
     * {@link userService.createUser(UserAddReq)} 方法是否會拋出預(yù)期的 {@link RuntimeException} 異常。
     * 
     * @param none 該測試方法不接受任何參數(shù)。
     * @return void 該測試方法沒有返回值。
     * @throws RuntimeException 如果提供的用戶添加請求中的郵箱地址無效,該方法將拋出異常。
     */
@Test
public void createUser_WithInvalidEmail_ShouldThrowException() {
    // 斷言當(dāng)嘗試使用無效的郵箱創(chuàng)建用戶時,會拋出運(yùn)行時異常
    Exception exception = assertThrows(RuntimeException.class, () -> {
        userService.createUser(invalidEmailUserAddReq);
    });
    // 驗(yàn)證拋出的異常消息是否為預(yù)期的錯誤消息
    assertEquals("郵箱格式不正確", exception.getMessage());
    // 驗(yàn)證用戶映射器的 insert 方法是否從未被調(diào)用
    verify(userMapper, never()).insert(any(UserAddReq.class));
}
/**
     * 測試創(chuàng)建用戶時,如果郵箱為null,應(yīng)該拋出異常。
     * 這個測試方法不接受任何參數(shù),也不會返回任何值。
     * 它主要通過斷言驗(yàn)證在嘗試使用null郵箱創(chuàng)建用戶時,是否會拋出運(yùn)行時異常,并且異常的消息文本是否正確。
     */
@Test
public void createUser_WithNullEmail_ShouldThrowException() {
    // Act & Assert: 嘗試使用null郵箱創(chuàng)建用戶,并驗(yàn)證是否拋出了預(yù)期的運(yùn)行時異常
    Exception exception = assertThrows(RuntimeException.class, () -> {
        userService.createUser(nullEmailUserAddReq);
    });
    assertEquals("郵箱不能為空", exception.getMessage()); // 驗(yàn)證異常消息是否正確
    verify(userMapper, never()).insert(any(UserAddReq.class)); // 驗(yàn)證用戶映射器的insert方法是否從未被調(diào)用
}

六、統(tǒng)計單元測試覆蓋率

1、單元測試覆蓋率概念

單元測試覆蓋率是指程序中被執(zhí)行的單元測試所覆蓋的源代碼行數(shù)或分支數(shù)占總行數(shù)或分支數(shù)的比例。通常分為行覆蓋率、分支覆蓋率、語句覆蓋率、方法覆蓋率等多種度量維度。理想的覆蓋率并非追求100%,而是力求覆蓋所有關(guān)鍵路徑和邊界條件,以最大程度地暴露潛在錯誤。

2、單元測試覆蓋率的重要性

  • 保證代碼質(zhì)量:高覆蓋率意味著更多的代碼邏輯經(jīng)過了直接或間接的驗(yàn)證,有助于減少因未測試代碼引入的缺陷。
  • 推動重構(gòu)與優(yōu)化:覆蓋率數(shù)據(jù)可以幫助識別冗余或難以測試的代碼段,進(jìn)而推動代碼結(jié)構(gòu)的改進(jìn)。
  • 持續(xù)集成與持續(xù)部署:在CI/CD流程中,設(shè)定合理的覆蓋率閾值,可以作為構(gòu)建是否通過的門檻,防止低質(zhì)量代碼流入生產(chǎn)環(huán)境。

3、主流覆蓋率統(tǒng)計工具

JaCoCo:JaCoCo是一款適用于Java字節(jié)碼的開源覆蓋率工具,它支持無縫集成到Maven、Gradle構(gòu)建工具和Eclipse、IntelliJ IDEA等IDE中。對于Spring Boot應(yīng)用,可以通過JaCoCo插件輕松獲取和報告單元測試覆蓋率。

<!-- Maven中JaCoCo配置示例 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.7</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

4、Spring Boot項(xiàng)目中實(shí)現(xiàn)覆蓋率統(tǒng)計

在Spring Boot項(xiàng)目中,JaCoCo可通過以下步驟實(shí)現(xiàn)單元測試覆蓋率統(tǒng)計:

添加JaCoCo相關(guān)依賴至構(gòu)建文件(如上述Maven配置所示)。運(yùn)行單元測試,JaCoCo會在運(yùn)行時注入代理類收集覆蓋率數(shù)據(jù)。測試完成后,JaCoCo會自動生成覆蓋率報告,通常位于target/site/jacoco/index.html路徑下,打開即可查看詳細(xì)的覆蓋率詳情。

此外,在持續(xù)集成環(huán)境下,可以結(jié)合SonarQube等代碼質(zhì)量管理平臺,將JaCoCo生成的覆蓋率報告導(dǎo)入,實(shí)時監(jiān)控和管理項(xiàng)目的測試覆蓋率。

七、本地啟用覆蓋率

  • 在運(yùn)行/調(diào)試配置對話框中,找到你想要運(yùn)行的單元測試配置或者創(chuàng)建一個新的JUnit運(yùn)行配置。
  • 在配置詳情頁中,找到“Code Coverage”選項(xiàng)卡。

單元測試報告如下

八、結(jié)論

統(tǒng)計單元測試覆蓋率是一項(xiàng)基礎(chǔ)且必要的軟件工程實(shí)踐,它能夠直觀反映測試的質(zhì)量和全面性。通過合理選擇和配置覆蓋率工具,配合良好的單元測試策略,開發(fā)者能夠在不斷迭代和演進(jìn)的軟件項(xiàng)目中保持高質(zhì)量的代碼標(biāo)準(zhǔn),從而降低系統(tǒng)風(fēng)險,保障產(chǎn)品質(zhì)量。

九、總結(jié)

綜上所述,Mockito與Spring Boot的整合為Java開發(fā)者提供了一套完整的解決方案,使得單元測試更為精準(zhǔn)、高效,從而確保了代碼質(zhì)量、降低了維護(hù)成本,并促進(jìn)了項(xiàng)目的持續(xù)集成與交付。通過合理運(yùn)用Mockito的各項(xiàng)功能,開發(fā)者能夠編寫出高度可信賴且易于維護(hù)的單元測試代碼。

相關(guān)聯(lián)文章鏈接:

 深入解析與實(shí)踐Mockito:Java單元測試的強(qiáng)大助手

Git項(xiàng)目地址-對應(yīng)的project:springboot-mockito-study

到此這篇關(guān)于Spring Boot 整合 Mockito提升Java單元測試的高效實(shí)踐的文章就介紹到這了,更多相關(guān)Spring Boot 整合 Mockito內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)的圖片裁剪功能示例

    java實(shí)現(xiàn)的圖片裁剪功能示例

    這篇文章主要介紹了java實(shí)現(xiàn)的圖片裁剪功能,涉及java針對圖片的讀取、轉(zhuǎn)換、保存等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Java啟用Azure Linux虛擬機(jī)診斷設(shè)置

    Java啟用Azure Linux虛擬機(jī)診斷設(shè)置

    這篇文章主要介紹了Java啟用Azure Linux虛擬機(jī)診斷設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • JDK1.8源碼下載及idea2021導(dǎo)入jdk1.8源碼的詳細(xì)步驟

    JDK1.8源碼下載及idea2021導(dǎo)入jdk1.8源碼的詳細(xì)步驟

    這篇文章主要介紹了JDK1.8源碼下載及idea2021導(dǎo)入jdk1.8源碼的詳細(xì)步驟,在文章開頭就給大家分享了JDK1.8源碼下載地址和下載步驟,告訴大家idea2021.1.3導(dǎo)入JDK1.8源碼步驟,需要的朋友可以參考下
    2022-11-11
  • 新手初學(xué)Java常見排序算法

    新手初學(xué)Java常見排序算法

    排序(Sorting) 是計算機(jī)程序設(shè)計中的一種重要操作,它的功能是將一個數(shù)據(jù)元素(或記錄)的任意序列,重新排列成一個關(guān)鍵字有序的序列
    2021-07-07
  • springboot配置允許跨域訪問代碼實(shí)例

    springboot配置允許跨域訪問代碼實(shí)例

    這篇文章主要介紹了springboot配置允許跨域訪問代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Java工程mybatis實(shí)現(xiàn)多表查詢過程詳解

    Java工程mybatis實(shí)現(xiàn)多表查詢過程詳解

    這篇文章主要介紹了Java工程mybatis實(shí)現(xiàn)多表查詢過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java中for與foreach的區(qū)別

    Java中for與foreach的區(qū)別

    本文主要介紹了Java中for與foreach的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 全面探究 Java 內(nèi)部類

    全面探究 Java 內(nèi)部類

    說起內(nèi)部類這個詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫代碼時可能用到的場景不多,用得最多的是在有事件監(jiān)聽的情況下,并且即使用到也很少去總結(jié)內(nèi)部類的用法。今天我們就來一探究竟
    2021-09-09
  • Java根據(jù)日期截取字符串的多種實(shí)現(xiàn)方法

    Java根據(jù)日期截取字符串的多種實(shí)現(xiàn)方法

    在實(shí)際開發(fā)中,我們經(jīng)常會遇到需要根據(jù)日期來截取字符串的需求,例如從文件名中提取日期信息,Java 提供了多種方法來實(shí)現(xiàn)根據(jù)日期來截取字符串的功能,本文將給大家介紹了Java根據(jù)日期截取字符串的多種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2024-11-11
  • Java中Object類的理解和使用

    Java中Object類的理解和使用

    Object類是java.lang包下的核心類,Object類是所有類的父類,何一個類時候如果沒有明確的繼承一個父類的話,那么它就是Object的子類,本文將通過代碼示例詳細(xì)介紹一下Java中Object類的理解和使用,需要的朋友可以參考下
    2023-06-06

最新評論