当前位置: 首页 > 面试题库 >

测试Java套接字

西门飞翮
2023-03-14
问题内容

我正在开发网络应用程序,我想正确进行单元测试。这次我们会做的,你知道吗?:)

我在测试网络连接时遇到了麻烦。

在我的应用程序中,我使用plain java.net.Socket

例如:

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Message {
    byte[] payload;

    public Message(byte[] payload) {
        this.payload = payload;
    }

    public boolean sendTo(String hostname, int port) {
        boolean sent = false;

        try {
            Socket socket = new Socket(hostname, port);

            OutputStream out = socket.getOutputStream();

            out.write(payload);

            socket.close();

            sent = true;
        } catch (UnknownHostException e) {
        } catch (IOException e) {
        }

        return sent;
    }
}

我读过有关模拟的内容,但不确定如何应用。


问题答案:

如果要测试代码,请执行以下操作。

首先,重构代码,以便Socket不会在要测试的方法中直接实例化。下面的示例显示了我可以想到的最小更改。将来的更改可能会将Socket创建过程排除在一个完全独立的类之外,但是我喜欢一些小步骤,而且我不喜欢在未经测试的代码上进行大的更改。

public boolean sendTo(String hostname, int port) {
    boolean sent = false;

    try {
        Socket socket = createSocket();
        OutputStream out = socket.getOutputStream();
        out.write(payload);
        socket.close();
        sent = true;
    } catch (UnknownHostException e) {
        // TODO
    } catch (IOException e) {
        // TODO
    }

    return sent;
}

protected Socket createSocket() {
    return new Socket();
}

既然套接字创建逻辑不在您要测试的方法之外,您就可以开始进行模拟并加入套接字的创建中。

public class MessageTest {
    @Test
    public void testSimplePayload() () {
        byte[] emptyPayload = new byte[1001];

        // Using Mockito
        final Socket socket = mock(Socket.class);
        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        when(socket.getOutputStream()).thenReturn(byteArrayOutputStream);

        Message text = new Message(emptyPayload) {
            @Override
            protected Socket createSocket() {
                return socket;
            }
        };

        Assert.assertTrue("Message sent successfully", text.sendTo("localhost", "1234"));
        Assert.assertEquals("whatever you wanted to send".getBytes(), byteArrayOutputStream.toByteArray());
    }
}

在要测试的单元上覆盖单个方法对于测试确实有用,尤其是在具有可怕依赖关系的丑陋代码中。显然,最好的解决方案是解决依赖关系(在这种情况下,我认为a
Message不依赖a Socket,也许会Messager像glowcoder所建议的那样有一个接口),但是最好以尽可能小的步骤迈向解决方案。



 类似资料:
  • 5个脚本(type='text/javascript'6var socket=io.connect();7个socket.on('makeAlert',function(){ Ty感谢你的帮助

  • 主要内容:1. 测试类,2. testng.xml,其他例子测试套件是用于测试软件程序的行为或一组行为的测试用例的集合。 在TestNG中,我们无法在测试源代码中定义一个套件,但它可以由一个XML文件表示,因为套件是执行的功能。 它还允许灵活配置要运行的测试。 套件可以包含一个或多个测试,并由标记定义。 是的根标记。 它描述了一个测试套件,它又由几个部分组成。 下表列出了接受的所有定义的合法属性。 属性 描述 name 套件的名称,这是一个强制属性。 ve

  • 主要内容:1 概述,2 创建简单的Maven项目,3 项目包装结构,4 更新pom.xml文件中的JUnit依赖关系,5 创建LoginService.java和LoginServiceTest.java,,6.创建UserService.java和UserServiceTest.java,7 创建测试套件,8 结论1 概述 在本指南中,我们将学习如何一次运行多个测试类。将Suite用作运行程序可以使您手动构建一个包含许多类测试的套件。它等效于JUnit 3.8.x静态Test suite()方

  • 嵌套测试给测试编写者更多的能力,来表达几组测试之间的关系。这里有一个详细的例子。 用于测试stack的嵌套测试套件: import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.ju

  • 测试套件是测试的集合。通常会在一个测试套件将所有的测试作为一个连续的批处理作业运行。 Selenium IDE 可以用一个简单的 HTML 文件来定义测试套件。语法也很简单。一个 HTML 表格定义了一个测试列表,其中的每一行定义了每个测试文件的路径。举个例子: <html> <head> <title>Test Suite Function Tests - Priority 1</title>

  • 测试 oil test(或 oil t)命令运行与你的 web app、模组和套件相关的 PHPUnit 测试。关于 FuelPHP 单元测试的完整文件可以在 单元测试 文件页面找到,而关于 PHPUnit 的完整文件可以在 PHPUnit 网站找到。 配置 Oil 实用工具本身不需要太多配置,但如果在你机器上的 PHPUnit 实例不是全域安装(例如,如果你使用 Composer 安装 PHPU