近期在重構一些舊項目,看到之前同事編寫的測試用例是使用注入SpringJUnit4ClassRunner 直接注冊實現層然后測試需要操作的方法是否可運行。雖然這樣說是可以達到測試的想法。但是如果要使用在入口的業務控制層,還要有預期的測試結果,那豈不是要寫一大堆邏輯來驗證了。。因此使用該方案是很笨重的,測試起來也麻煩。然而bug率還是沒降低多少。。

因此引入mock來進行改造該測試用例,以業務控制層為切入點,斷言預判是否符合結果。這樣就達到測試的效果了。
import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import java.util.Map; import static junit.framework.TestCase.assertNotNull; import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc @Slf4j public class ApplicationTests { @Autowired protected MockMvc mvc; @Before public void init() { assertNotNull(mvc); } @Test public void signParamsMock() { Map params = Maps.newHashMap(); params.put("catalogId", "1"); params.put("user", "user"); try {
//業務控制層,URI請求 MvcResult result = mvc.perform(MockMvcRequestBuilders.post("/colorfulPay/signParams", params)).andReturn();
//斷言預判結果是否返回包含true,若不符合,就拋出異常 assertThat(result.getResponse().getContentAsString()).contains("true"); log.info("result:{}", result.getResponse().getContentAsString()); } catch (Exception e) { e.printStackTrace(); } } }
