Spring Boot单元测试之分层测试与整体测试

单元测试Case

单元测试1:

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerApplicationTest {
    @Autowired    
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Spring Boot!")));
    }
}

单元测试2:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {
    @Autowired
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
    mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("Spring Boot!")));
    }
}

单元测试3:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {

@LocalServerPort
private int port;

private URL base;

@Autowired
private TestRestTemplate template;

@Before
public void setUp() throws Exception {
    this.base = new URL("http://localhost:" + port + "/");
}

@Test
public void getHello() throws Exception {
    ResponseEntity<String> response = template.getForEntity(base.toString(),
            String.class);
    assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
}
}

这三个测试用例实现类似的功能,但是它们之间有什么区别呢?

区别与分析

第一个是仅仅扫描Controller的代码进行执行,如果Controller中有相关依赖则需要Mock,并进行调用功能的提前赋值,方可正常进行测试。

第二个则是启动了整个Application context,从而调用Controller层的功能进行触发,其底层功能依赖,比如Service,则无需进行依赖。

第三个功能类似第二种方式,区别在于调用HTTP服务的方式不同,这里使用TestRestTemplate的实例来进行的。

其他注解

@DataJpaTest
@JsonTest
@WebMvcTest
@RestClientTests
@JdbcTest
@WebFluxTest

总结

一般情况基于当个层的测试会比较隔离,但是需要自行注入依赖。而基于Spring Boot Test则自动加载了依赖,会比较容易。

参考资料

  1. https://stackoverflow.com/questions/39865596/difference-between-using-mockmvc-with-springboottest-and-using-webmvctest
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值