Java 使用junit进行MQTT客户端测试

Java 使用junit进行MQTT客户端测试,java,unit-testing,spring-boot,mqtt,Java,Unit Testing,Spring Boot,Mqtt,我正在尝试测试使用MQTT客户机的Spring引导应用程序。我想测试几个类似以下区域的属性: 它是否正确处理连接故障 它是否正确处理连接成功 它是否解析消息负载json?正确地 它是否正确处理格式错误的有效负载。 来源 因此,简化了我的MQTT客户机代码: @Component public class MQTTController implements MqttCallback { MqttClient client; @Value("${spring.mqtt.

我正在尝试测试使用MQTT客户机的Spring引导应用程序。我想测试几个类似以下区域的属性:

它是否正确处理连接故障 它是否正确处理连接成功 它是否解析消息负载json?正确地 它是否正确处理格式错误的有效负载。 来源

因此,简化了我的MQTT客户机代码:

@Component
public class MQTTController implements MqttCallback {

    MqttClient client;

    @Value("${spring.mqtt.serverURI}")
    private String serverURI;

    @Value("${spring.mqtt.port}")
    private String serverPort;
    
    @Bean
    private MqttClient receiveData() {
        try{
            client = new MqttClient(serverURI + ":" + serverPort, "Receiver");
            client.connect();
            client.setCallback(this);
            client.subscribe("someTopic");
            return client;
        }
        catch(Exception e){
            log.error("MQTT ERROR");
            log.error(e.toString());
        }
        return null;
    }

    public void connectionLost(Throwable cause) {
    }

    public void messageArrived(String topic, MqttMessage message) throws Exception {
        someActionWithTheData(message.ToString());
    }

    public void deliveryComplete(IMqttDeliveryToken token) {
    }
}
主要问题是在测试期间,我没有MQTT代理。我的代理只在docker容器上可用,我必须在不使用它的情况下测试这个类。 我在mqtt包org.eclipse.paho.client.mqttv3中搜索了一些嵌入式代理进行测试,但什么也没找到。我不想仅仅为了一个单元测试就向我的项目添加另一个依赖项


那么,有没有一种方法可以在不向MQTT代理添加依赖项的情况下测试这个类?如果没有,最简单的方法是什么?

我认为您正在寻找一个模拟框架。我来自C++,但我认为这也是适用的:基本上,你为所有的关联注入一个被嘲笑的对象,你应该是MQTTeCube,并且对于每个成员函数,你使用框架的嘲弄能力,这样你就可以在指定指定的参数值的特定测试用例中描述这个函数的行为来检查。比如说

经过一些研究,我发现:

Mockito一段很好地介绍了模拟功能性和基于测试的行为


希望有帮助,祝你有愉快的一天

我认为您正在寻找一个模拟框架。我来自C++,但我认为这也是适用的:基本上,你为所有的关联注入一个被嘲笑的对象,你应该是MQTTeCube,并且对于每个成员函数,你使用框架的嘲弄能力,这样你就可以在指定指定的参数值的特定测试用例中描述这个函数的行为来检查。比如说

经过一些研究,我发现:

Mockito一段很好地介绍了模拟功能性和基于测试的行为


希望有帮助,祝你有愉快的一天

最佳实践是将基础结构的代码部分与业务代码分开。这样,您就可以编写单元测试来只测试应用程序的业务。 在您的示例中,您可以简单地编写一个单元测试来测试messageArrived方法。比如说,

@Test
public void test_on_message() {

    MQTTController controller = new MQTTController();

    MqttMessage message = new MqttMessage();

    controller.messageArrived("my_topic", message);

    ...
}
您还可以使用Mockito提供MqttMessage及其方法ToString的模拟

然后,您还可以通过在测试中提供嵌入式代理来编写集成测试。我认为最好的方法是使用。您可以从docker映像创建代理MQTT。 在本例中,它从它的官方docker创建了一个代理


最佳实践是将基础结构的代码部分与业务代码分开。这样,您就可以编写单元测试来只测试应用程序的业务。 在您的示例中,您可以简单地编写一个单元测试来测试messageArrived方法。比如说,

@Test
public void test_on_message() {

    MQTTController controller = new MQTTController();

    MqttMessage message = new MqttMessage();

    controller.messageArrived("my_topic", message);

    ...
}
您还可以使用Mockito提供MqttMessage及其方法ToString的模拟

然后,您还可以通过在测试中提供嵌入式代理来编写集成测试。我认为最好的方法是使用。您可以从docker映像创建代理MQTT。 在本例中,它从它的官方docker创建了一个代理