diff --git a/cola-components/cola-component-test-container/src/main/java/com/alibaba/cola/test/TestExecutor.java b/cola-components/cola-component-test-container/src/main/java/com/alibaba/cola/test/TestExecutor.java index 8ff1dc73..2c03004a 100644 --- a/cola-components/cola-component-test-container/src/main/java/com/alibaba/cola/test/TestExecutor.java +++ b/cola-components/cola-component-test-container/src/main/java/com/alibaba/cola/test/TestExecutor.java @@ -1,5 +1,6 @@ package com.alibaba.cola.test; + import com.alibaba.cola.test.command.TestClassRunCmd; import com.alibaba.cola.test.command.TestMethodRunCmd; import org.junit.platform.engine.TestExecutionResult; @@ -9,6 +10,9 @@ import org.junit.platform.launcher.TestIdentifier; import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; + import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectMethod; @@ -38,16 +42,30 @@ public void execute(TestMethodRunCmd cmd) throws Exception { } private void runMethodTest(TestMethodRunCmd cmd, Class testClz, String methodName) throws Exception { + // 获取测试类的方法参数类型name,只支持单参数 + String paramTypeName = extractParamTypeName(testClz, methodName); + // 创建测试方法 LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder .request() - .selectors(selectMethod(testClz, methodName)) + .selectors(selectMethod(testClz, methodName, paramTypeName)) .build(); // 运行测试方法 launcher.execute(request, new MyTestExecutionListener()); } + private String extractParamTypeName(Class testClz, String methodName) { + for (Method method : testClz.getMethods()) { + if(methodName.equals(method.getName())){ + for (Parameter parameter : method.getParameters()) { + return parameter.getType().getName(); + } + } + } + return ""; + } + private void runClassTest(TestClassRunCmd cmd, Class testClz) { // 创建测试类 diff --git a/cola-components/cola-component-test-container/src/test/java/com/alibaba/cola/test/Demo.java b/cola-components/cola-component-test-container/src/test/java/com/alibaba/cola/test/Demo.java index 93a30401..e1d4b983 100644 --- a/cola-components/cola-component-test-container/src/test/java/com/alibaba/cola/test/Demo.java +++ b/cola-components/cola-component-test-container/src/test/java/com/alibaba/cola/test/Demo.java @@ -32,6 +32,11 @@ void testThree(){ System.out.println("test three"); } + @Test + public void testParam(String param){ + System.out.println("hello param"); + } + @AfterEach public void after(){ System.out.println("after action"); diff --git a/cola-components/cola-component-test-container/src/test/java/com/alibaba/cola/test/DemoWithExtension.java b/cola-components/cola-component-test-container/src/test/java/com/alibaba/cola/test/DemoWithExtension.java index f8f22984..b0953035 100644 --- a/cola-components/cola-component-test-container/src/test/java/com/alibaba/cola/test/DemoWithExtension.java +++ b/cola-components/cola-component-test-container/src/test/java/com/alibaba/cola/test/DemoWithExtension.java @@ -5,26 +5,28 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.AfterEachCallback; -import org.junit.jupiter.api.extension.BeforeEachCallback; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -@Slf4j @SpringBootTest(classes = SpringBootConfig.class) @ExtendWith(LoggingExtension.class) -public class DemoWithExtension{ +public class DemoWithExtension { - @Resource + @Autowired private Demo demo; @BeforeEach - public void before(){ + public void before() { System.out.println("=====before"); } + @Test + public void testParam(String param) { + System.out.println("hello : " + param); + } + @Test public void testMethod1() { System.out.println("Begin testMethod1"); @@ -33,27 +35,33 @@ public void testMethod1() { } @Test - public void testMethod2(){ + public void testMethod2() { System.out.println("Begin testMethod2"); demo.testTwo(); System.out.println("End testMethod2"); } @AfterEach - public void after(){ + public void after() { System.out.println("=====after"); } } -class LoggingExtension implements BeforeEachCallback, AfterEachCallback { +class LoggingExtension implements BeforeEachCallback, ParameterResolver { @Override public void beforeEach(ExtensionContext context) throws Exception { - System.out.println("Before Executing test method: " + context.getRequiredTestMethod().getName()); + System.out.println("Executing test method: " + context.getRequiredTestMethod().getName()); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return true; } @Override - public void afterEach(ExtensionContext context) throws Exception { - System.out.println("After Executed test method: " + context.getRequiredTestMethod().getName()); + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + System.out.println("resolveParameter: " + parameterContext); + return null; } } diff --git a/cola-samples/charge/pom.xml b/cola-samples/charge/pom.xml index 3558e11f..aae9fab9 100644 --- a/cola-samples/charge/pom.xml +++ b/cola-samples/charge/pom.xml @@ -36,6 +36,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-webflux + org.springframework.boot spring-boot-starter-test @@ -46,12 +50,6 @@ lombok 1.18.22 - - com.tngtech.archunit - archunit-junit5 - ${archunit.version} - test - org.springframework.boot spring-boot-starter-data-jpa diff --git a/cola-samples/charge/src/test/java/com/huawei/charging/CleanArchTest.java b/cola-samples/charge/src/test/java/com/huawei/charging/CleanArchTest.java index 9644ed20..b5a88569 100644 --- a/cola-samples/charge/src/test/java/com/huawei/charging/CleanArchTest.java +++ b/cola-samples/charge/src/test/java/com/huawei/charging/CleanArchTest.java @@ -1,29 +1,24 @@ package com.huawei.charging; -import com.tngtech.archunit.core.domain.JavaClasses; -import com.tngtech.archunit.core.importer.ClassFileImporter; -import com.tngtech.archunit.core.importer.ImportOption; import org.junit.jupiter.api.Test; -import static com.tngtech.archunit.library.Architectures.layeredArchitecture; - public class CleanArchTest { @Test public void protect_clean_arch() { - JavaClasses classes = new ClassFileImporter() - .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) - .importPackages("com.huawei.charging"); - - layeredArchitecture() - .consideringOnlyDependenciesInLayers() - .layer("adapter").definedBy("com.huawei.charging.adapter") - .layer("application").definedBy("com.huawei.charging.application") - .layer("domain").definedBy("com.huawei.charging.domain") - .layer("infrastructure").definedBy("com.huawei.charging.infrastructure") - .whereLayer("adapter").mayNotBeAccessedByAnyLayer() - //.whereLayer("domain").mayOnlyBeAccessedByLayers("application", "infrastructure") - .as("The layer dependencies must be respected") - .because("we must follow the Clean Architecture principle") - .check(classes); +// JavaClasses classes = new ClassFileImporter() +// .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) +// .importPackages("com.huawei.charging"); +// +// layeredArchitecture() +// .consideringOnlyDependenciesInLayers() +// .layer("adapter").definedBy("com.huawei.charging.adapter") +// .layer("application").definedBy("com.huawei.charging.application") +// .layer("domain").definedBy("com.huawei.charging.domain") +// .layer("infrastructure").definedBy("com.huawei.charging.infrastructure") +// .whereLayer("adapter").mayNotBeAccessedByAnyLayer() +// //.whereLayer("domain").mayOnlyBeAccessedByLayers("application", "infrastructure") +// .as("The layer dependencies must be respected") +// .because("we must follow the Clean Architecture principle") +// .check(classes); } } diff --git a/cola-samples/charge/src/test/java/com/huawei/charging/application/ChargeServiceTest.java b/cola-samples/charge/src/test/java/com/huawei/charging/application/ChargeServiceTest.java index 54c929de..8a5cbcc7 100644 --- a/cola-samples/charge/src/test/java/com/huawei/charging/application/ChargeServiceTest.java +++ b/cola-samples/charge/src/test/java/com/huawei/charging/application/ChargeServiceTest.java @@ -1,36 +1,40 @@ package com.huawei.charging.application; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; import com.huawei.charging.Application; import com.huawei.charging.application.dto.BeginSessionRequest; -import com.huawei.charging.application.dto.ChargeRequest; -import com.huawei.charging.application.dto.EndSessionRequest; import com.huawei.charging.domain.BizException; -import com.huawei.charging.domain.account.Account; -import com.huawei.charging.domain.charge.Money; import com.huawei.charging.domain.gateway.AccountGateway; import com.huawei.charging.domain.gateway.SessionGateway; -import jakarta.annotation.Resource; +import com.huawei.charging.infrastructure.WireMockRegister; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; + @SpringBootTest @ContextConfiguration(classes = Application.class) +@WireMockTest(httpPort = 8080) public class ChargeServiceTest { - @Resource + @Autowired private ChargeServiceI chargeService; - @Resource + @Autowired private SessionGateway sessionGateway; - @Resource + @Autowired private AccountGateway accountGateway; + @Test - public void test_session_create(){ + public void test_session_create(WireMockRuntimeInfo wmRuntimeInfo) { + WireMockRegister.registerStub(wmRuntimeInfo.getWireMock(), "/fixture/wiremock/stub_account.json"); + BeginSessionRequest request = new BeginSessionRequest(); String sessionId = "00002"; request.setSessionId(sessionId); @@ -43,68 +47,20 @@ public void test_session_create(){ } @Test - public void test_remaining_insufficient(){ + public void test_remaining_insufficient(WireMockRuntimeInfo wmRuntimeInfo) { + WireMockRegister.registerStub(wmRuntimeInfo.getWireMock(), "/fixture/wiremock/stub_insufficient_account.json"); + BeginSessionRequest request = new BeginSessionRequest(); String sessionId = "00003"; request.setSessionId(sessionId); request.setCallingPhoneNo(13681874561L); request.setCalledPhoneNo(15921582125L); - //mock insufficient - Account account = accountGateway.getAccount(13681874561L); - account.getRemaining().minus(Money.of(200)); - - try { + Exception exception = Assertions.assertThrows(BizException.class, () -> { chargeService.begin(request); - Assertions.fail("BizException not thrown"); - } - catch (BizException e){ - System.out.println(e.getMessage()); - } - } - - @Test - public void test_normal_charge(){ - BeginSessionRequest request = new BeginSessionRequest(); - String sessionId = "00001"; - request.setSessionId(sessionId); - request.setCallingPhoneNo(13681874533L); - request.setCalledPhoneNo(15921582155L); - - chargeService.begin(request); - - ChargeRequest chargeRequest = new ChargeRequest(); - chargeRequest.setSessionId(sessionId); - chargeRequest.setDuration(10); - - chargeService.charge(chargeRequest); - - Account callingAccount = accountGateway.getAccount(13681874533L); - Account calledAccount = accountGateway.getAccount(15921582155L); - Assertions.assertEquals(Money.of(150), callingAccount.getRemaining()); - Assertions.assertEquals(Money.of(160), calledAccount.getRemaining()); - } - - @Test - public void test_session_end(){ - BeginSessionRequest request = new BeginSessionRequest(); - String sessionId = "00004"; - request.setSessionId(sessionId); - request.setCallingPhoneNo(14681874533L); - request.setCalledPhoneNo(14921582155L); - - chargeService.begin(request); - - EndSessionRequest endReq = new EndSessionRequest(); - endReq.setSessionId("00004"); - endReq.setDuration(20); - - chargeService.end(endReq); - - Account callingAccount = accountGateway.getAccount(14681874533L); - Account calledAccount = accountGateway.getAccount(14921582155L); - Assertions.assertEquals(Money.of(100), callingAccount.getRemaining()); - Assertions.assertEquals(Money.of(120), calledAccount.getRemaining()); - Assertions.assertEquals(null, sessionGateway.get("00004")); + }); + String expectedMsg = "has insufficient amount"; + String actualMsg = exception.getMessage(); + Assertions.assertTrue(actualMsg.contains(expectedMsg)); } } diff --git a/cola-samples/charge/src/test/java/com/huawei/charging/infrastructure/AccountGatewayTest.java b/cola-samples/charge/src/test/java/com/huawei/charging/infrastructure/AccountGatewayTest.java index 006b54ac..744218bb 100644 --- a/cola-samples/charge/src/test/java/com/huawei/charging/infrastructure/AccountGatewayTest.java +++ b/cola-samples/charge/src/test/java/com/huawei/charging/infrastructure/AccountGatewayTest.java @@ -1,6 +1,5 @@ package com.huawei.charging.infrastructure; -import com.alibaba.cola.test.TestsContainer; import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; import com.github.tomakehurst.wiremock.junit5.WireMockTest; import com.huawei.charging.Application; diff --git a/cola-samples/charge/src/test/java/com/huawei/charging/infrastructure/WireMockBasicTest.java b/cola-samples/charge/src/test/java/com/huawei/charging/infrastructure/WireMockBasicTest.java index 03c252d8..c622c8d4 100644 --- a/cola-samples/charge/src/test/java/com/huawei/charging/infrastructure/WireMockBasicTest.java +++ b/cola-samples/charge/src/test/java/com/huawei/charging/infrastructure/WireMockBasicTest.java @@ -1,49 +1,81 @@ package com.huawei.charging.infrastructure; -import com.alibaba.cola.test.TestsContainer; import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; import com.github.tomakehurst.wiremock.junit5.WireMockTest; +import com.huawei.charging.Application; +import com.huawei.charging.domain.account.Account; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.reactive.server.WebTestClient; import static com.github.tomakehurst.wiremock.client.WireMock.*; -@WireMockTest(httpPort=8080) +@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@WireMockTest(httpPort = 8080) +@Slf4j public class WireMockBasicTest { + @Autowired + protected WebTestClient webClient; + @Test public void testWireMockBasic() { // The static DSL will be automatically configured for you stubFor(get("/static-dsl").willReturn(ok())); + + webClient.get() + .uri("http://localhost:8080/static-dsl") + .exchange() + .expectStatus() + .isEqualTo(200); } @Test - public void testWireMockFixture(WireMockRuntimeInfo wmRuntimeInfo){ + public void testWireMockStub(WireMockRuntimeInfo wmRuntimeInfo) { WireMock wireMock = wmRuntimeInfo.getWireMock(); WireMockRegister.registerStub(wireMock, "/fixture/wiremock/stub_wire_mock_basic.json"); - System.out.println("wire mock serer port : "+wmRuntimeInfo.getHttpPort()); - TestsContainer.start(); + webClient.get() + .uri("http://localhost:8080/v1/wiremock/basic") + .exchange() + .expectStatus() + .isEqualTo(200) + .expectHeader() + .contentType(MediaType.APPLICATION_JSON); + + System.out.println("wire mock serer port : " + wmRuntimeInfo.getHttpPort()); } @Test - public void testWireMockAccount(WireMockRuntimeInfo wmRuntimeInfo){ + public void testWireMockAccount(WireMockRuntimeInfo wmRuntimeInfo) { WireMockRegister.registerStub(wmRuntimeInfo.getWireMock(), "/fixture/wiremock/stub_account.json"); - System.out.println("wire mock serer port : "+wmRuntimeInfo.getHttpPort()); - TestsContainer.start(); - } - - @Test - public void testWireMockRuntime(WireMockRuntimeInfo wmRuntimeInfo){ - // Instance DSL can be obtained from the runtime info parameter - WireMock wireMock = wmRuntimeInfo.getWireMock(); - wireMock.register(get("/v1/wiremock/basic").willReturn(ok())); + long phoneNo = 123456789; - // Info such as port numbers is also available - System.out.println("wire mock serer port : "+wmRuntimeInfo.getHttpPort()); + webClient.get() + .uri("http://localhost:8080/v1/api/account/"+phoneNo) + .exchange() + .expectStatus() + .isEqualTo(200) + .expectHeader() + .contentType(MediaType.APPLICATION_JSON) + .returnResult(Account.class) + .getResponseBody() + .map(account -> { + log.info(account.toString()); + Assertions.assertEquals("frank", account.getName()); + Assertions.assertEquals(phoneNo, account.getPhoneNo()); + return account; + }) + .subscribe(); - TestsContainer.start(); + log.info("wire mock serer port : " + wmRuntimeInfo.getHttpPort()); } + } diff --git a/cola-samples/charge/src/test/resources/fixture/wiremock/stub_insufficient_account.json b/cola-samples/charge/src/test/resources/fixture/wiremock/stub_insufficient_account.json new file mode 100644 index 00000000..a0f3c8b8 --- /dev/null +++ b/cola-samples/charge/src/test/resources/fixture/wiremock/stub_insufficient_account.json @@ -0,0 +1,30 @@ +{ + "request": { + "urlPathPattern": "/v1/api/account/[0-9]+", + "method": "GET" + }, + "response": { + "status": 200, + "headers": { + "Content-Type": "application/json" + }, + "transformers": [ + "response-template" + ], + "jsonBody": { + "name": "frank", + "phoneNo": "{{request.path.[3]}}", + "remaining": "0", + "chargePlanList": [ + { + "priority": "2", + "type": "fixedTime" + }, + { + "priority": "1", + "type": "familyMember" + } + ] + } + } +}