diff --git a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSequencer.java b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSequencer.java index dde13f9..d4a76fc 100644 --- a/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSequencer.java +++ b/scfs-api-core/src/main/java/com/czcb/scfs/api/core/cipher/DefaultSequencer.java @@ -15,11 +15,7 @@ public class DefaultSequencer implements Sequencer { @Override public String next() { - return String.format("%s%s%s", getCurrentDate(), getRandomStr(), getNumber()); - } - - private String getCurrentDate() { - return DateTimes.of("yyyyMMdd"); + return String.format("%s%s%s", DateTimes.of("yyyyMMdd"), getRandomStr(), number.getAndIncrement()); } private String getRandomStr() { @@ -30,8 +26,4 @@ public class DefaultSequencer implements Sequencer { return sb.toString(); } - - private Integer getNumber() { - return number.getAndIncrement(); - } } diff --git a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/AbstractAutoConfiguration.java b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/AbstractAutoConfiguration.java index ae33761..75ec4ac 100644 --- a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/AbstractAutoConfiguration.java +++ b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/AbstractAutoConfiguration.java @@ -11,6 +11,9 @@ import com.czcb.scfs.api.core.http.Proxy; * @since 2.0.0 */ public abstract class AbstractAutoConfiguration { + public static final String PREFIX = "scfs.api-gateway.cipher"; + public static final String CIPHER_TYPE = "type"; + protected abstract ScfsApiGatewayProperties getProperties(); protected HttpProfile getHttpProfile() { diff --git a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/RsaConfiguration.java b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/RsaConfiguration.java index 1d9ae34..c21a483 100644 --- a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/RsaConfiguration.java +++ b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/RsaConfiguration.java @@ -1,8 +1,10 @@ package com.czcb.scfs.spring.boot.starter; +import com.czcb.scfs.api.core.cipher.Sequencer; import com.czcb.scfs.api.core.cipher.StoreType; import com.czcb.scfs.api.core.util.PemFile; import com.czcb.scfs.api.rsa.RsaProfile; +import lombok.Getter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -16,22 +18,25 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import static com.czcb.scfs.spring.boot.starter.AbstractAutoConfiguration.CIPHER_TYPE; +import static com.czcb.scfs.spring.boot.starter.AbstractAutoConfiguration.PREFIX; + /** * @since 2.0.0 */ +@Getter @Configuration @ConditionalOnClass(RsaProfile.class) -@ConditionalOnProperty(value = "scfs.api-gateway.cipher.type", havingValue = "rsa") +@ConditionalOnProperty(prefix = PREFIX, value = CIPHER_TYPE, havingValue = RsaConfiguration.HAVING_VALUE) public class RsaConfiguration extends AbstractAutoConfiguration { + public static final String HAVING_VALUE = "rsa"; + private final ScfsApiGatewayProperties properties; + private final Sequencer sequencer; - public RsaConfiguration(ScfsApiGatewayProperties properties) { + public RsaConfiguration(ScfsApiGatewayProperties properties, Sequencer sequencer) { this.properties = properties; - } - - @Override - public ScfsApiGatewayProperties getProperties() { - return properties; + this.sequencer = sequencer; } private List getCertificates() { @@ -63,6 +68,7 @@ public class RsaConfiguration extends AbstractAutoConfiguration { .httpProfile(getHttpProfile()) .privateKey(getPrivateKey()) .addCertificates(getCertificates()) + .sequencer(getSequencer()) .build(); } } diff --git a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java index 9b6e94e..c78cb7d 100644 --- a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java +++ b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java @@ -2,8 +2,6 @@ package com.czcb.scfs.spring.boot.starter; import com.czcb.scfs.api.core.ApiClient; import com.czcb.scfs.api.core.Profile; -import com.czcb.scfs.api.core.cipher.DefaultSequencer; -import com.czcb.scfs.api.core.cipher.Sequencer; import com.czcb.scfs.api.core.http.ApiClientBuilder; import com.czcb.scfs.api.service.echo.EchoService; import com.czcb.scfs.api.service.v2.account.AccountService; @@ -25,7 +23,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; import javax.annotation.Resource; @@ -35,7 +32,6 @@ import javax.annotation.Resource; @Configuration @ComponentScan("com.czcb.scfs.spring.boot.starter") @EnableConfigurationProperties({ScfsApiGatewayProperties.class}) -@Import({SmConfiguration.class, RsaConfiguration.class}) public class ScfsAutoConfiguration { @Resource private Profile profile; @@ -56,15 +52,6 @@ public class ScfsAutoConfiguration { return new EchoService(apiClient); } - /** - * 发号器 - */ - @Bean - @ConditionalOnMissingBean - public Sequencer sequencer() { - return new DefaultSequencer(); - } - /** * 账户相关 */ diff --git a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/SequencerAutoConfiguration.java b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/SequencerAutoConfiguration.java new file mode 100644 index 0000000..fbfb732 --- /dev/null +++ b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/SequencerAutoConfiguration.java @@ -0,0 +1,23 @@ +package com.czcb.scfs.spring.boot.starter; + +import com.czcb.scfs.api.core.cipher.DefaultSequencer; +import com.czcb.scfs.api.core.cipher.Sequencer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author wangwei + * @since 2024/7/26 + */ +@Configuration +public class SequencerAutoConfiguration { + /** + * 发号器 + */ + @Bean + @ConditionalOnMissingBean + public Sequencer sequencer() { + return new DefaultSequencer(); + } +} diff --git a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/SmConfiguration.java b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/SmConfiguration.java index 19d6b09..85796d6 100644 --- a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/SmConfiguration.java +++ b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/SmConfiguration.java @@ -1,9 +1,11 @@ package com.czcb.scfs.spring.boot.starter; +import com.czcb.scfs.api.core.cipher.Sequencer; import com.czcb.scfs.api.core.cipher.StoreType; import com.czcb.scfs.api.core.util.PemFile; import com.czcb.scfs.api.sm.SmProfile; import com.tencent.kona.KonaProvider; +import lombok.Getter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -17,22 +19,26 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import static com.czcb.scfs.spring.boot.starter.AbstractAutoConfiguration.CIPHER_TYPE; +import static com.czcb.scfs.spring.boot.starter.AbstractAutoConfiguration.PREFIX; +import static com.czcb.scfs.spring.boot.starter.SmConfiguration.HAVING_VALUE; + /** * @since 2.0.0 */ +@Getter @Configuration @ConditionalOnClass(SmProfile.class) -@ConditionalOnProperty(value = "scfs.api-gateway.cipher.type", havingValue = "sm", matchIfMissing = true) +@ConditionalOnProperty(prefix = PREFIX, value = CIPHER_TYPE, havingValue = HAVING_VALUE, matchIfMissing = true) public class SmConfiguration extends AbstractAutoConfiguration { + public static final String HAVING_VALUE = "sm"; + private final ScfsApiGatewayProperties properties; + private final Sequencer sequencer; - public SmConfiguration(ScfsApiGatewayProperties properties) { + public SmConfiguration(ScfsApiGatewayProperties properties, Sequencer sequencer) { this.properties = properties; - } - - @Override - public ScfsApiGatewayProperties getProperties() { - return properties; + this.sequencer = sequencer; } private List getCertificates() { @@ -65,6 +71,7 @@ public class SmConfiguration extends AbstractAutoConfiguration { .privateKey(getPrivateKey()) .certificateSerial(getChannelCertificateSerial()) .addCertificates(getCertificates()) + .sequencer(getSequencer()) .build(); } } diff --git a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/AbstractAutoConfigurationTest.java b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/AbstractAutoConfigurationTest.java new file mode 100644 index 0000000..fdda927 --- /dev/null +++ b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/AbstractAutoConfigurationTest.java @@ -0,0 +1,12 @@ +package com.czcb.scfs.spring.boot.starter; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class AbstractAutoConfigurationTest { + @Test + void test() { + Assertions.assertEquals("scfs.api-gateway.cipher", AbstractAutoConfiguration.PREFIX); + Assertions.assertEquals("type", AbstractAutoConfiguration.CIPHER_TYPE); + } +} \ No newline at end of file diff --git a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/RsaConfigurationTest.java b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/RsaConfigurationTest.java index 62ffc0a..016e07f 100644 --- a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/RsaConfigurationTest.java +++ b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/RsaConfigurationTest.java @@ -1,14 +1,21 @@ package com.czcb.scfs.spring.boot.starter; +import com.czcb.scfs.api.core.cipher.DefaultSequencer; import com.czcb.scfs.api.core.cipher.StoreType; import com.czcb.scfs.api.core.http.LogLevel; import com.czcb.scfs.api.rsa.RsaProfile; import org.assertj.core.util.Lists; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; +import java.lang.annotation.Annotation; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; @@ -16,6 +23,46 @@ class RsaConfigurationTest { private RsaConfiguration rsaConfiguration; + @Test + void testHavingValue() { + Assertions.assertEquals("rsa", RsaConfiguration.HAVING_VALUE); + } + + @Test + void testAnnotation() { + Annotation[] annotations = RsaConfiguration.class.getAnnotations(); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(Configuration.class))); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(ConditionalOnClass.class))); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(ConditionalOnProperty.class))); + + Assertions.assertEquals(3, annotations.length); + } + + @Test + void testConditionalOnClass() { + Annotation[] annotations = RsaConfiguration.class.getAnnotations(); + Optional optional = Arrays.stream(annotations) + .filter(annotation -> annotation.annotationType().isAssignableFrom(ConditionalOnClass.class)) + .findFirst(); + Assertions.assertTrue(optional.isPresent()); + Assertions.assertArrayEquals(new Class[]{RsaProfile.class}, ((ConditionalOnClass) optional.get()).value()); + } + + @Test + void testConditionalOnProperty() { + Annotation[] annotations = RsaConfiguration.class.getAnnotations(); + Optional optional = Arrays.stream(annotations) + .filter(annotation -> annotation.annotationType().isAssignableFrom(ConditionalOnProperty.class)) + .findFirst(); + + Assertions.assertTrue(optional.isPresent()); + Assertions.assertFalse(((ConditionalOnProperty) optional.get()).matchIfMissing()); + Assertions.assertArrayEquals(new String[]{"type"}, ((ConditionalOnProperty) optional.get()).value()); + Assertions.assertEquals("scfs.api-gateway.cipher", ((ConditionalOnProperty) optional.get()).prefix()); + Assertions.assertEquals("rsa", ((ConditionalOnProperty) optional.get()).havingValue()); + } + + private ScfsApiGatewayProperties properties() { ScfsApiGatewayProperties properties = new ScfsApiGatewayProperties(); @@ -63,14 +110,14 @@ class RsaConfigurationTest { @Test void getProperties() { - rsaConfiguration = new RsaConfiguration(properties()); + rsaConfiguration = new RsaConfiguration(properties(), new DefaultSequencer()); ScfsApiGatewayProperties properties = rsaConfiguration.getProperties(); Assertions.assertNotNull(properties); } @Test void smProfile() { - rsaConfiguration = new RsaConfiguration(properties()); + rsaConfiguration = new RsaConfiguration(properties(), new DefaultSequencer()); RsaProfile profile = rsaConfiguration.rsaProfile(); Assertions.assertNotNull(profile); assertThatJson("{\"appNo\":\"111111\",\"channelNo\":\"000000\",\"channelGroupMode\":false}").isEqualTo(profile.getChannel()); diff --git a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfigurationTest.java b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfigurationTest.java index 2d51d59..b15a905 100644 --- a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfigurationTest.java +++ b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfigurationTest.java @@ -1,6 +1,7 @@ package com.czcb.scfs.spring.boot.starter; import com.czcb.scfs.api.core.ApiClient; +import com.czcb.scfs.api.core.cipher.DefaultSequencer; import com.czcb.scfs.api.core.cipher.StoreType; import com.czcb.scfs.api.core.http.LogLevel; import com.czcb.scfs.api.core.http.client.ApacheHttpclient; @@ -10,14 +11,50 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import java.lang.annotation.Annotation; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.Optional; @ExtendWith(MockitoExtension.class) class ScfsAutoConfigurationTest { private final ScfsAutoConfiguration configuration = new ScfsAutoConfiguration(); + @Test + void testAnnotation() { + Annotation[] annotations = ScfsAutoConfiguration.class.getAnnotations(); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(Configuration.class))); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(ComponentScan.class))); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(EnableConfigurationProperties.class))); + + Assertions.assertEquals(3, annotations.length); + } + + @Test + void testComponentScan() { + Annotation[] annotations = ScfsAutoConfiguration.class.getAnnotations(); + Optional optional = Arrays.stream(annotations) + .filter(annotation -> annotation.annotationType().isAssignableFrom(ComponentScan.class)) + .findFirst(); + Assertions.assertTrue(optional.isPresent()); + Assertions.assertArrayEquals(new String[]{"com.czcb.scfs.spring.boot.starter"}, ((ComponentScan) optional.get()).value()); + } + + @Test + void testEnableConfigurationProperties() { + Annotation[] annotations = ScfsAutoConfiguration.class.getAnnotations(); + Optional optional = Arrays.stream(annotations) + .filter(annotation -> annotation.annotationType().isAssignableFrom(EnableConfigurationProperties.class)) + .findFirst(); + Assertions.assertTrue(optional.isPresent()); + Assertions.assertArrayEquals(new Class[]{ScfsApiGatewayProperties.class}, ((EnableConfigurationProperties) optional.get()).value()); + } + private ScfsApiGatewayProperties properties() { ScfsApiGatewayProperties properties = new ScfsApiGatewayProperties(); @@ -63,7 +100,7 @@ class ScfsAutoConfigurationTest { } protected ApiClient apiClient() { - SmConfiguration smConfiguration = new SmConfiguration(properties()); + SmConfiguration smConfiguration = new SmConfiguration(properties(), new DefaultSequencer()); return new ApacheHttpclient(HttpClients.custom().build(), smConfiguration.smProfile()); } @@ -72,11 +109,6 @@ class ScfsAutoConfigurationTest { Assertions.assertNotNull(configuration.echoService(apiClient())); } - @Test - void sequencer() { - Assertions.assertNotNull(configuration.sequencer()); - } - @Test void accountService() { Assertions.assertNotNull(configuration.accountService(apiClient())); diff --git a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/SequencerAutoConfigurationTest.java b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/SequencerAutoConfigurationTest.java new file mode 100644 index 0000000..9320198 --- /dev/null +++ b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/SequencerAutoConfigurationTest.java @@ -0,0 +1,12 @@ +package com.czcb.scfs.spring.boot.starter; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class SequencerAutoConfigurationTest { + @Test + void sequencer() { + SequencerAutoConfiguration configuration = new SequencerAutoConfiguration(); + Assertions.assertNotNull(configuration.sequencer()); + } +} \ No newline at end of file diff --git a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/SmConfigurationTest.java b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/SmConfigurationTest.java index fa3e75c..798f4c5 100644 --- a/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/SmConfigurationTest.java +++ b/scfs-api-spring-boot-starter/src/test/java/com/czcb/scfs/spring/boot/starter/SmConfigurationTest.java @@ -1,5 +1,6 @@ package com.czcb.scfs.spring.boot.starter; +import com.czcb.scfs.api.core.cipher.DefaultSequencer; import com.czcb.scfs.api.core.cipher.StoreType; import com.czcb.scfs.api.core.http.LogLevel; import com.czcb.scfs.api.sm.SmProfile; @@ -8,9 +9,15 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; +import java.lang.annotation.Annotation; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; @@ -19,6 +26,45 @@ class SmConfigurationTest { private SmConfiguration smConfiguration; + @Test + void testHavingValue() { + Assertions.assertEquals("sm", SmConfiguration.HAVING_VALUE); + } + + @Test + void testAnnotation() { + Annotation[] annotations = SmConfiguration.class.getAnnotations(); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(Configuration.class))); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(ConditionalOnClass.class))); + Assertions.assertTrue(Arrays.stream(annotations).anyMatch(annotation -> annotation.annotationType().isAssignableFrom(ConditionalOnProperty.class))); + + Assertions.assertEquals(3, annotations.length); + } + + @Test + void testConditionalOnClass() { + Annotation[] annotations = SmConfiguration.class.getAnnotations(); + Optional optional = Arrays.stream(annotations) + .filter(annotation -> annotation.annotationType().isAssignableFrom(ConditionalOnClass.class)) + .findFirst(); + Assertions.assertTrue(optional.isPresent()); + Assertions.assertArrayEquals(new Class[]{SmProfile.class}, ((ConditionalOnClass) optional.get()).value()); + } + + @Test + void testConditionalOnProperty() { + Annotation[] annotations = SmConfiguration.class.getAnnotations(); + Optional optional = Arrays.stream(annotations) + .filter(annotation -> annotation.annotationType().isAssignableFrom(ConditionalOnProperty.class)) + .findFirst(); + + Assertions.assertTrue(optional.isPresent()); + Assertions.assertTrue(((ConditionalOnProperty) optional.get()).matchIfMissing()); + Assertions.assertArrayEquals(new String[]{"type"}, ((ConditionalOnProperty) optional.get()).value()); + Assertions.assertEquals("scfs.api-gateway.cipher", ((ConditionalOnProperty) optional.get()).prefix()); + Assertions.assertEquals("sm", ((ConditionalOnProperty) optional.get()).havingValue()); + } + private ScfsApiGatewayProperties properties(boolean channelGroupMode) { ScfsApiGatewayProperties properties = new ScfsApiGatewayProperties(); @@ -70,14 +116,14 @@ class SmConfigurationTest { @Test void getProperties() { - smConfiguration = new SmConfiguration(properties(false)); + smConfiguration = new SmConfiguration(properties(false), new DefaultSequencer()); ScfsApiGatewayProperties properties = smConfiguration.getProperties(); Assertions.assertNotNull(properties); } @Test void smProfile() { - smConfiguration = new SmConfiguration(properties(true)); + smConfiguration = new SmConfiguration(properties(true), new DefaultSequencer()); SmProfile smProfile = smConfiguration.smProfile(); Assertions.assertNotNull(smProfile); assertThatJson("{\"appNo\":\"111111\",\"channelNo\":\"000000\",\"channelGroupMode\":true}").isEqualTo(smProfile.getChannel()); diff --git a/scfs-api-test/src/test/java/com/czcb/scfs/api/test/CustomSequencerTest.java b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/CustomSequencerTest.java new file mode 100644 index 0000000..2f9ccef --- /dev/null +++ b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/CustomSequencerTest.java @@ -0,0 +1,35 @@ +package com.czcb.scfs.api.test; + +import com.czcb.scfs.api.core.cipher.Sequencer; +import com.czcb.scfs.api.service.echo.EchoService; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +/** + * 测试自定义发号器 + * + * @author wangwei + * @since 2024/7/26 + */ +@SpringBootTest +@Import(CustomSequencerTest.CustomSequencer.class) +class CustomSequencerTest { + @Resource + private EchoService echoService; + + @Test + void test() { + Assertions.assertThrows(UnsupportedOperationException.class, () -> echoService.echo()); + } + + public static class CustomSequencer implements Sequencer { + @Override + public String next() { + throw new UnsupportedOperationException(); + } + } +}