diff --git a/modules/apps/command-gateway/pom.xml b/modules/apps/command-gateway/pom.xml
index 4efd2c7e..10eeedae 100644
--- a/modules/apps/command-gateway/pom.xml
+++ b/modules/apps/command-gateway/pom.xml
@@ -49,5 +49,10 @@
assertj-core
test
+
+ org.springframework.boot
+ spring-boot-test
+ test
+
diff --git a/modules/apps/command-gateway/src/main/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfiguration.java b/modules/apps/command-gateway/src/main/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfiguration.java
index 7a12d56b..c987f13b 100644
--- a/modules/apps/command-gateway/src/main/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfiguration.java
+++ b/modules/apps/command-gateway/src/main/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfiguration.java
@@ -8,7 +8,7 @@ import org.springframework.web.servlet.DispatcherServlet;
@AutoConfiguration
@ConditionalOnClass(DispatcherServlet.class)
-@ConditionalOnProperty(prefix = "lingniu.ingest.command-gateway", name = "enabled", havingValue = "true", matchIfMissing = true)
+@ConditionalOnProperty(prefix = "lingniu.ingest.command-gateway", name = "enabled", havingValue = "true")
@ComponentScan(basePackageClasses = TerminalCommandController.class)
public class CommandGatewayAutoConfiguration {
// 只扫描 REST 下行命令网关;不参与 32960 接收、RAW 冷存或历史查询链路。
diff --git a/modules/apps/command-gateway/src/test/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfigurationTest.java b/modules/apps/command-gateway/src/test/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfigurationTest.java
new file mode 100644
index 00000000..9f162bbe
--- /dev/null
+++ b/modules/apps/command-gateway/src/test/java/com/lingniu/ingest/gateway/CommandGatewayAutoConfigurationTest.java
@@ -0,0 +1,62 @@
+package com.lingniu.ingest.gateway;
+
+import com.lingniu.ingest.session.CommandDispatcher;
+import com.lingniu.ingest.session.DeviceSession;
+import com.lingniu.ingest.session.SessionStore;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.autoconfigure.AutoConfigurations;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+
+import java.time.Duration;
+import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.UnaryOperator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class CommandGatewayAutoConfigurationTest {
+
+ private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(CommandGatewayAutoConfiguration.class))
+ .withBean(SessionStore.class, EmptySessionStore::new)
+ .withBean(CommandDispatcher.class, NoopCommandDispatcher::new);
+
+ @Test
+ void backsOffByDefault() {
+ contextRunner.run(context -> assertThat(context).doesNotHaveBean(TerminalCommandController.class));
+ }
+
+ @Test
+ void createsControllerWhenExplicitlyEnabled() {
+ contextRunner
+ .withPropertyValues("lingniu.ingest.command-gateway.enabled=true")
+ .run(context -> assertThat(context).hasSingleBean(TerminalCommandController.class));
+ }
+
+ private static final class NoopCommandDispatcher implements CommandDispatcher {
+ @Override
+ public CompletableFuture notify(String sessionId, Object command) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ @Override
+ public CompletableFuture request(String sessionId,
+ Object command,
+ Class responseType,
+ Duration timeout) {
+ return CompletableFuture.failedFuture(new UnsupportedOperationException("not used"));
+ }
+ }
+
+ private static final class EmptySessionStore implements SessionStore {
+ @Override public void put(DeviceSession session) {}
+ @Override public Optional findBySessionId(String sessionId) { return Optional.empty(); }
+ @Override public Optional findByVin(String vin) { return Optional.empty(); }
+ @Override public Optional findByPhone(String phone) { return Optional.empty(); }
+ @Override public Optional update(String sessionId, UnaryOperator updater) {
+ return Optional.empty();
+ }
+ @Override public void remove(String sessionId) {}
+ @Override public int size() { return 0; }
+ }
+}