Solon

for JUnit4 增强

提醒:Junit4 的 @Test 为 org.junit.Test,不要和 Junit5 的搞混了

1、主要扩展

扩展说明
SolonJUnit4ClassRunner 类为 junit4 提供 Solon 的注入支持的运行类
HttpTestBase 类用于 Http 测试的基类
@SolonTest 注解用于指定 Solon 的启动主类。无此注解时,则以当前类为启动主类
@Rollback 注解用户测试时事务回滚用
@TestPropertySource 注解用于指定测试所需的配置文件

2、使用示例

引入插件:

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

a)使用 @Test 注解

即使用 junit 4 的原生能力

import org.junit.Test;

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

b)使用 @RunWith(SolonJUnit4ClassRunner.class),增加 Solon 注入能力

当前类将做为 Solon 启动的主类。还可借助 @Import 扫描其它的包(顺带提示:@Import 只在 主类上 或者 @Configuration类 上有效)。

  • 提供Solon容器服务支持
import org.junit.Test;
import org.junit.runner.RunWith;

@TestPropertySource("classpath:demo/app.yml")
@RunWith(SolonJUnit4ClassRunner.class) 
public class DemoTest {

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

    @Test
    public void hello() {
        System.out.println("Hello " + userName);
    }
}
  • 提供Solon容器服务支持,并导扫描其它包
import org.junit.Test;
import org.junit.runner.RunWith;

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

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

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

c)使用 @RunWith(SolonJUnit4ClassRunner.class) + @SolonTest 注解

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

  • 启动Solon应用,并进行http接口测试
import org.junit.Test;
import org.junit.runner.RunWith;

@SolonTest(webapp.TestApp.class) 
@RunWith(SolonJUnit4ClassRunner.class)
public class DemoTest extends HttpTestBase{

    @Inject
    UserService userService;

    @Test
    public void hello() {
        //测试注入的Service
        assert userService.hello("world").equals("hello world");
    }
    
    @Test
    public void demo1_run0() {
        //HttpTestBase 提供的请求本地 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应用,并设定启动参数
import org.junit.Test;
import org.junit.runner.RunWith;

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

    @Inject
    UserService userService;

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