網頁

2019/8/31

Spring Boot JUnit 5 Gradle 設定

在Spring Boot 2.1 Gradle專案使用JUnit 5測試框架的設定如下。


注意,從Spring Boot 2.2版本開始spring-boot-starter-test預設已經是JUnit 5,就無需再進行以下設定。請參考Spring Boot 2.2 Release Notes



在Gradle配置檔(Configuration file) build.gradle設定以下。

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web' // Spring Boot Web
    testImplementation ('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module: 'junit' // 排除JUnit 4的依賴
    }
    
    // JUnit 5 依賴設定
    testImplementation 'org.junit.jupiter:junit-jupiter-api' // JUnit 5 API 介面
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' // JUnit 5 測試框架的實作
}

test {
    useJUnitPlatform() // 指明使用JUnit 5來測試
}

本範例的Spring Boot版本為2.1.7.RELEASE,其spring-boot-starter-test預設是依賴JUnit 4,所以設定了exclude排除對JUnit 4的傳遞依賴(Transitive dependencies)。

testImplementation用來引入測試用的依賴。

testRuntimeOnly用來引入測試執行期間(runtime)時的依賴。

useJUnitPlatform()是指明用JUnit 5的JUnit Platform來測試。


下面是簡單的Spring Boot JUnit 5的簡單範例。注意要引用正確的Annotation。

被測試類別DemoServiceA

DemoServiceA

package com.abc.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DemoServiceA {

    @Autowired
    private DemoServiceB demoServiceB;

    public int addInt(int a, int b) {
        return demoServiceB.add(a, b);
    }

}

測試類別DemoServiceATests

DemoServiceATests

package com.abc.demo.service;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@ExtendWith(SpringExtension.class)
@SpringBootTest
public class DemoServiceATests {

    @Autowired
    private DemoServiceA demoServiceA;

    @MockBean
    private DemoServiceB demoServiceB;

    @Test
    public void testAddInt() {

        int a = 1;
        int b = 2;

        when(demoServiceB.add(a, b)).thenReturn(3);

        int actual = demoServiceA.addInt(a, b);
        int expected = 3;

        assertEquals(expected, actual);

    }

}


參考:

沒有留言:

張貼留言