From 31a5b2ab3f617e878e6f973dc3990255bfc30c2d Mon Sep 17 00:00:00 2001 From: Tang Cheng Date: Mon, 25 Nov 2019 22:01:48 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E5=8D=95=E5=85=83=E6=B5=8B?= =?utf8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- build.gradle | 15 +- payapi-common/build.gradle | 1 - .../api/bean/CitizenCardPayinitParamTest.java | 123 ++++++++++++- .../api/controller/user_api_controller.kt | 24 ++- .../kotlin/com/supwisdom/dlpay/MvcBaseTest.kt | 21 ++- .../dlpay/controller/ApiControllerTest.kt | 2 - .../dlpay/controller/UserControllerTest.kt | 171 ++++++++++++------ .../kotlin/com/supwisdom/dlpay/utils_test.kt | 1 + 8 files changed, 266 insertions(+), 92 deletions(-) diff --git a/build.gradle b/build.gradle index 0b1c3c0b..a4cd5b1e 100644 --- a/build.gradle +++ b/build.gradle @@ -13,11 +13,24 @@ allprojects { jcenter() mavenCentral() } - +} + +ext { + set('junit_jupiter_version', "5.5.2") + set("junit_platform_version", "1.5.2") + set("mockitoVersion", "3.1.0") } subprojects { + apply plugin: 'java' version = '1.0' + dependencies { + testImplementation("org.junit.jupiter:junit-jupiter-api:${junit_jupiter_version}") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junit_jupiter_version}") + testRuntimeOnly("org.junit.platform:junit-platform-launcher:${junit_platform_version}") + testImplementation("io.mockk:mockk:1.9.3") + testImplementation("org.hamcrest:hamcrest:2.1") + } } bootJar { diff --git a/payapi-common/build.gradle b/payapi-common/build.gradle index a1776a5d..106d0ad3 100644 --- a/payapi-common/build.gradle +++ b/payapi-common/build.gradle @@ -48,5 +48,4 @@ dependencies { implementation 'org.apache.commons:commons-lang3:3.9' - testImplementation 'junit:junit:4.12' } \ No newline at end of file diff --git a/payapi-common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java b/payapi-common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java index 0b3dd8b1..0a20a779 100644 --- a/payapi-common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java +++ b/payapi-common/src/test/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParamTest.java @@ -1,25 +1,116 @@ package com.supwisdom.dlpay.api.bean; +import com.supwisdom.dlpay.api.annotation.*; import com.supwisdom.dlpay.api.types.IDTypes; import com.supwisdom.dlpay.api.types.SexTypes; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; -import java.util.*; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; public class CitizenCardPayinitParamTest { private Validator validator; - @org.junit.Before + @IDNoCheck(idno = "idno", idtype = "idtype", value = IDTypes.IDTYPE_LIST) + public static class TestBean { + @TransDate(message = "不是合法的交易日期") + private String transDate; + @TransTime(message = "不是合法的交易时间") + private String transTime; + + @Sex + private String sex; + + @MobileNumber + private String mobile; + + private String valueList; + + @UserStatus + private String status; + + private String idtype; + + private String idno; + + public String getTransDate() { + return transDate; + } + + public void setTransDate(String transDate) { + this.transDate = transDate; + } + + public String getTransTime() { + return transTime; + } + + public void setTransTime(String transTime) { + this.transTime = transTime; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getValueList() { + return valueList; + } + + public void setValueList(String valueList) { + this.valueList = valueList; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getIdtype() { + return idtype; + } + + public void setIdtype(String idtype) { + this.idtype = idtype; + } + + public String getIdno() { + return idno; + } + + public void setIdno(String idno) { + this.idno = idno; + } + } + + @BeforeEach public void setUp() throws Exception { ValidatorFactory factor = Validation.buildDefaultValidatorFactory(); validator = factor.getValidator(); @@ -31,7 +122,7 @@ public class CitizenCardPayinitParamTest { List> violations = validate(param); String message = getViolationMessage(violations); - assertFalse(message, violations.isEmpty()); + assertFalse(violations.isEmpty(), message); } private List> validate(T param) { @@ -53,17 +144,31 @@ public class CitizenCardPayinitParamTest { public void testOpenUserParam() { OpenUserParam param = new OpenUserParam(); List> result = validate(param); - assertFalse(getViolationMessage(result), result.isEmpty()); + assertFalse(result.isEmpty(), getViolationMessage(result)); param.setIdtype(IDTypes.IDCARD.value()); - param.setIdno("123213"); + param.setIdno("123456789012345678"); param.setUid("1231323"); param.setName("lily"); param.setSex(SexTypes.MALE.value()); param.setMobile("+8618272733888"); result = validate(param); - assertTrue(getViolationMessage(result), result.isEmpty()); + assertTrue(result.isEmpty(), getViolationMessage(result)); + } + + @Test + void testCustomizeValidator() { + TestBean bean = new TestBean(); + bean.setIdtype(IDTypes.IDCARD.value()); + bean.setIdno("123456789012345678"); + bean.setTransDate("20191001"); + bean.setTransTime("135943"); + bean.setMobile("+8618621110059"); + bean.setSex("male"); + bean.setStatus("open"); + List> result = validate(bean); + assertThat(getViolationMessage(result), result.isEmpty()); } } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt index a964b023..baa1e34e 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt @@ -42,20 +42,18 @@ class UserAPIController { @PostMapping("/open") fun openAccount(@RequestBody param: OpenUserParam): ResponseEntity { try { - useService.findByThirdUniqueIdenty(param.uid).let { - if (null != it) { - return ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.REGISTER_USER_EXIST, "该用户唯一号已经注册")) - } + useService.findByThirdUniqueIdenty(param.uid).takeIf { it != null }?.let { + return ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.REGISTER_USER_EXIST, "该用户唯一号已经注册")) + } - param.name = URLDecoder.decode(param.name, Charsets.UTF_8.toString()) //解码 - param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码 - useService.registerUser(param).let { - return ResponseEntity.ok(ResponseBodyBuilder.create() - .data("userid", it.userid) - .data("uid", param.uid) - .success()) - } + param.name = URLDecoder.decode(param.name, Charsets.UTF_8.toString()) //解码 + param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码 + return useService.registerUser(param).let { person -> + ResponseEntity.ok(ResponseBodyBuilder.create() + .data("userid", person.userid) + .data("uid", param.uid) + .success()) } } catch (ex: RequestParamCheckException) { return ResponseEntity.ok(ResponseBodyBuilder.create() diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt index 91bd2e1c..99294c20 100644 --- a/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt +++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/MvcBaseTest.kt @@ -1,24 +1,25 @@ package com.supwisdom.dlpay import com.google.gson.Gson -import org.junit.runner.RunWith +import org.junit.jupiter.api.BeforeEach +import org.mockito.MockitoAnnotations 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.ActiveProfiles -import org.springframework.test.context.TestPropertySource -import org.springframework.test.context.junit4.SpringRunner import org.springframework.test.web.servlet.MockMvc /** * mvc 基础测试类 * 放置基础方法,如认证信息等 */ -@RunWith(SpringRunner::class) -@SpringBootTest -@AutoConfigureMockMvc -abstract class MvcBaseTest{ +//@RunWith(SpringRunner::class) +//@SpringBootTest +//@AutoConfigureMockMvc +abstract class MvcBaseTest { @Autowired protected lateinit var mvc: MockMvc val gson = Gson() + + @BeforeEach + fun setup() { + MockitoAnnotations.initMocks(this) + } } \ No newline at end of file diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt index 01d6e50f..672a074a 100644 --- a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt +++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/ApiControllerTest.kt @@ -1,9 +1,7 @@ package com.supwisdom.dlpay.controller import com.supwisdom.dlpay.MvcBaseTest -import com.supwisdom.dlpay.api.service.KafkaSendMsgService import org.junit.Test -import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.MediaType import org.springframework.test.web.servlet.request.MockMvcRequestBuilders import org.springframework.test.web.servlet.result.MockMvcResultHandlers diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt index c76eb14d..d13dc34a 100644 --- a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt +++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/UserControllerTest.kt @@ -1,80 +1,139 @@ package com.supwisdom.dlpay.controller import com.google.gson.Gson -import com.supwisdom.dlpay.MvcBaseTest import com.supwisdom.dlpay.api.bean.OpenUserParam import com.supwisdom.dlpay.api.bean.QueryUserParam +import com.supwisdom.dlpay.api.controller.UserAPIController import com.supwisdom.dlpay.api.domain.TAccount import com.supwisdom.dlpay.api.domain.TPerson -import org.junit.Assert -import org.junit.Test +import com.supwisdom.dlpay.api.service.UserService +import com.supwisdom.dlpay.framework.util.TradeErrorCode +import io.mockk.MockKAnnotations +import io.mockk.clearMocks +import io.mockk.every +import io.mockk.impl.annotations.InjectMockKs +import io.mockk.impl.annotations.MockK +import io.mockk.impl.annotations.RelaxedMockK +import io.mockk.junit5.MockKExtension +import io.mockk.verify +import org.hamcrest.Matchers.`is` +import org.hamcrest.Matchers.notNullValue +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith import org.springframework.http.MediaType +import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.result.MockMvcResultHandlers -import org.springframework.test.web.servlet.result.MockMvcResultMatchers +import org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath +import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status +import org.springframework.test.web.servlet.setup.MockMvcBuilders -class UserControllerTest : MvcBaseTest() { +@ExtendWith(MockKExtension::class) +internal class UserControllerTest { + companion object { + const val thirdUID = "101010" + } + + @InjectMockKs + var userAPIController = UserAPIController() + + lateinit var mockMvc: MockMvc + + @MockK + lateinit var userService: UserService + + private val person = TPerson().apply { + userid = "12312312213" + } + + private fun singlePerson() = person - class RetBean { - var userid: String = "" - var retcode: Int = 0 - lateinit var person: TPerson - lateinit var account: TAccount + @BeforeEach + fun `context load`() { + mockMvc = MockMvcBuilders.standaloneSetup(userAPIController) + .build() + MockKAnnotations.init(this, relaxUnitFun = true) + } + + @AfterEach + fun cleanup() { + clearMocks(userService) } @Test - fun open() { + fun `test open account error when thirdUID exists`() { val userParam = OpenUserParam() - userParam.uid = ""//random req + userParam.uid = thirdUID userParam.name = "测试名称" - val ret = mvc.perform(MockMvcRequestBuilders.post("/api/user/open").content(gson.toJson(userParam)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk) - .andDo(MockMvcResultHandlers.print()) - .andReturn() - val res = ret.response.contentAsString - Assert.assertNotNull(res) - val retBean = gson.fromJson(res, RetBean::class.java) - Assert.assertNotNull(retBean) - Assert.assertEquals(0, retBean.retcode) - Assert.assertNotNull(retBean.userid) - Assert.assertNotEquals("", retBean.userid) + every { userService.findByThirdUniqueIdenty(thirdUID) } returns singlePerson() + mockMvc.perform(MockMvcRequestBuilders.post("/api/user/open") + .contentType(MediaType.APPLICATION_JSON_UTF8) + .content(Gson().toJson(userParam))) + .andExpect(status().isOk) + .andExpect(jsonPath("$.retcode").value(TradeErrorCode.REGISTER_USER_EXIST)) + + verify(exactly = 1) { userService.findByThirdUniqueIdenty(thirdUID) } } @Test - fun get() { - - val userParam = QueryUserParam() - userParam.uid = "testuseruniqueId"//测试用 - val gson = Gson() - val ret = mvc.perform(MockMvcRequestBuilders.post("/api/user/open").content(gson.toJson(userParam)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk) - .andDo(MockMvcResultHandlers.print()) - .andReturn() - val resOpen = ret.response.contentAsString - Assert.assertNotNull(resOpen) - val retBeanOpen = gson.fromJson(resOpen, RetBean::class.java) - Assert.assertNotNull(retBeanOpen) - Assert.assertNotNull(retBeanOpen.userid) - userParam.userid = retBeanOpen.userid - - val retGet = mvc.perform(MockMvcRequestBuilders.get("/api/user/query").content(gson.toJson(userParam)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(MockMvcResultMatchers.status().isOk) - .andDo(MockMvcResultHandlers.print()) - .andReturn() - val res = retGet.response.contentAsString - Assert.assertNotNull(res) - val retBean = gson.fromJson(res, RetBean::class.java) - Assert.assertNotNull(retBean) - Assert.assertEquals(0, retBean.retcode) - Assert.assertNotNull(retBean.person) - Assert.assertEquals(retBeanOpen.userid, retBean.person.userid) - Assert.assertNotNull(retBeanOpen.account) - Assert.assertEquals(retBeanOpen.person.userid, retBean.account.userid) + fun `test open account success`() { + val userParam = OpenUserParam() + userParam.uid = thirdUID + userParam.name = "测试名称" + userParam.address = "上海市隆昌路619号8号楼" + + every { userService.findByThirdUniqueIdenty(thirdUID) } returns null + every { userService.registerUser(any()) } returns singlePerson() + mockMvc.perform(MockMvcRequestBuilders.post("/api/user/open") + .contentType(MediaType.APPLICATION_JSON_UTF8) + .content(Gson().toJson(userParam))) + .andExpect(status().isOk) + .andExpect(jsonPath("$.retcode").value(0)) + .andExpect(jsonPath("$.uid", notNullValue())) + .andExpect(jsonPath("$.userid").value(person.userid)) + + verify(exactly = 1) { userService.findByThirdUniqueIdenty(thirdUID) } + verify(exactly = 1) { userService.registerUser(any()) } } + @Test + fun `test query account success`() { + + val param = QueryUserParam().apply { + uid = thirdUID + userid = "1010101010" + } + + val person = TPerson().apply { + userid = param.userid + name = "张三" + idtype = "idcard" + idno = "10101010101" + mobile = "1231231" + email = "ddlddl" + status = "1" + } + val account = TAccount().apply { + userid = param.userid + availbal = 10.0 + } + every { userService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid) } returns person + every { userService.findAccountByUserid(param.userid, null) } returns account + every { userService.findPointsAccountByUserid(param.userid) } returns null + + mockMvc.perform(MockMvcRequestBuilders.post("/api/user/query") + .contentType(MediaType.APPLICATION_JSON_UTF8) + .content(Gson().toJson(param))) + .andExpect(status().isOk) + .andExpect(jsonPath("$.retcode", `is`(0))) + .andExpect(jsonPath("$.userid", `is`(param.userid))) + .andExpect(jsonPath("$.balance", `is`(10.0))) + + verify(exactly = 1) { userService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid) } + verify(exactly = 1) { userService.findAccountByUserid(param.userid, null) } + verify(exactly = 1) { userService.findPointsAccountByUserid(param.userid) } + } } \ No newline at end of file diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/utils_test.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/utils_test.kt index 33cba310..7c22f4c1 100644 --- a/payapi/src/test/kotlin/com/supwisdom/dlpay/utils_test.kt +++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/utils_test.kt @@ -8,6 +8,7 @@ class UtilsTest { @Test fun testAgentResponse() { val response = AgentResponse() + response.payload = "ok test" assertNotNull(response.payload) } } \ No newline at end of file -- 2.17.1