提醒：Junit5 的 @Test 为 `org.junit.jupiter.api.Test`，不要和 Junit4 的搞混了

### 1、主要扩展有


| 扩展 | 说明 | 
| -------- | -------- | 
| @SolonTest 注解     | 用于指定 Solon 的测试主类。      | 
| @Rollback 注解 | 用户测试时事务回滚用 |
| @Import 注解 | 用于导入测试所需的配置文件 |
| | |
| HttpTester 类     | 用于 Http 测试的基类     | 




### 2、使用示例

引入插件：（`solon-test`）

```xml
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-test</artifactId>
    <scope>test</scope>
</dependency>
```


#### a）使用 @Test 注解

即使用 junit 5 的原生能力

```java
import org.junit.jupiter.api.Test;

public class DemoTest {
    @Test
    public void hello() {
        System.out.println("Hello " + userName);
    }
}
```


#### b）使用 @SolonTest 注解，增加 Solon 能力

当前类将做为 Solon 启动的主类。还可借助 @Import 导入其它的包或配置（顺带提示：@Import 只在 主类上 或者 @Configuration类 上有效）。

* 提供 Solon 能力支持


```java
import org.junit.jupiter.api.Test;

@Import(profiles = "classpath:demo/app.yml")
@SolonTest
public class DemoTest {

    @Inject("${user.name:world}")
    String userName;

    @Test
    public void hello() {
        System.out.println("Hello " + userName);
    }
}
```

* 提供 Solon 能力支持，并导扫描其它包

```java
import org.junit.jupiter.api.Test;

@Import(scanPackages = "demo.b")
@SolonTest
public class DemoTest {

    @Inject("${user.name:world}")
    String userName;

    @Test
    public void hello() {
        System.out.println("Hello " + userName);
    }
}
```

#### c）使用 @SolonTest 注解的更多能力 [推荐]

通过 @SolonTest 注解，可指定其它类为启动主类并进行测试。

* 启动 Solon 应用，并进行 http 接口测试

```java
import org.junit.jupiter.api.Test;

@SolonTest(webapp.TestApp.class) 
public class DemoTest extends HttpTester{

    @Inject
    UserService userService;

    @Test
    public void hello() {
        //测试注入的Service
        assert userService.hello("world").equals("hello world");
    }
    
    @Test
    public void demo1_run0() {
        //HttpTester 提供的请求本地 http 服务的接口
        assert path("/demo1/run0/?str=").get().equals("不是null(ok)");
    }
    
    @Test
    public void demo2_header() throws Exception {
        Map<String, String> map = new LinkedHashMap<>();
        map.put("address", "192.168.1.1:9373");
        map.put("service", "wateradmin");
        map.put("meta", "");
        map.put("check_type", "0");
        map.put("is_unstable", "0");
        map.put("check_url", "/_run/check/");

        assert path("/demo2/header/")
                .header("Water-Trace-Id", "")
                .header("Water-From", "wateradmin@192.168.1.1:9373")
                .data(map)
                .post()
                .equals("OK");
    }
}
```


* 启动 Solon 应用，并设定启动参数

```java
import org.junit.jupiter.api.Test;

@SolonTest(value=webapp.TestApp.class, args="--server.port=9001") 
public class DemoTest extends HttpTester{

    @Inject
    UserService userService;

    @Test
    public void hello() {
        //测试注入的Service
        assert userService.hello("world").equals("hello world");
    }
}
```