package cn.iocoder.yudao.module.iot.service.rule.data.action; import cn.iocoder.yudao.module.iot.enums.rule.IotDataSinkTypeEnum; import org.eclipse.paho.client.mqttv3.MqttClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; /** * {@link IotMqttDataRuleAction} 的单元测试 * * @author HUIHUI */ class IotMqttDataRuleActionTest { private IotMqttDataRuleAction mqttDataRuleAction; @Mock private MqttClient mqttClient; @BeforeEach public void setUp() { MockitoAnnotations.openMocks(this); mqttDataRuleAction = new IotMqttDataRuleAction(); } @Test public void testGetType() { // 调用 & 断言:返回 MQTT 类型枚举值 assertEquals(IotDataSinkTypeEnum.MQTT.getType(), mqttDataRuleAction.getType()); } @Test public void testCloseProducer_whenConnected() throws Exception { // 准备:连接中状态 when(mqttClient.isConnected()).thenReturn(true); // 调用 mqttDataRuleAction.closeProducer(mqttClient); // 断言:先 disconnect 再 close verify(mqttClient, times(1)).disconnect(); verify(mqttClient, times(1)).close(); } @Test public void testCloseProducer_whenAlreadyDisconnected() throws Exception { // 准备:已断开状态 when(mqttClient.isConnected()).thenReturn(false); // 调用 mqttDataRuleAction.closeProducer(mqttClient); // 断言:跳过 disconnect,仅 close verify(mqttClient, never()).disconnect(); verify(mqttClient, times(1)).close(); } }