如何在java中模拟服务器关闭/可用?

如何在java中模拟服务器关闭/可用?,java,testing,jakarta-ee,automated-tests,Java,Testing,Jakarta Ee,Automated Tests,我们的应用程序具有服务器/客户端。客户端支持脱机和联机工作模式。 所以我需要在服务器关闭时测试客户机,恢复连接 问题来了。如何模拟服务器关闭。使用代码从“向下”切换到“就绪”,或从“就绪”切换到“向下”状态 提前谢谢 约瑟夫 更新: 实际上,我无法扩展服务器接口来响应错误的状态。在我的测试场景中,服务器是透明的。因此,不正确的url+端口是一种解决方案。 但是当会话有效时,我无法修改url。另一种方法是修改hosts文件以执行此操作。我必须面对Windows中的特权问题 取决于“服务器关闭”的

我们的应用程序具有服务器/客户端。客户端支持脱机和联机工作模式。 所以我需要在服务器关闭时测试客户机,恢复连接

问题来了。如何模拟服务器关闭。使用代码从“向下”切换到“就绪”,或从“就绪”切换到“向下”状态

提前谢谢

约瑟夫


更新: 实际上,我无法扩展服务器接口来响应错误的状态。在我的测试场景中,服务器是透明的。因此,不正确的url+端口是一种解决方案。
但是当会话有效时,我无法修改url。另一种方法是修改hosts文件以执行此操作。我必须面对Windows中的特权问题

取决于“服务器关闭”的含义。可能的选择包括:

  • 编写一个假/伪服务器,该服务器可以返回与出于测试目的停机对应的错误消息

  • 将客户端查找的服务器的IP地址更改为不存在的IP地址,以便它认为服务器已完全关闭


  • 这取决于“服务器关闭”的含义。可能的选择包括:

  • 编写一个假/伪服务器,该服务器可以返回与出于测试目的停机对应的错误消息

  • 将客户端查找的服务器的IP地址更改为不存在的IP地址,以便它认为服务器已完全关闭


  • 要模拟服务器停机情况,您可以编写一个ServerAlwaysDown类扩展实际服务器,但为每个连接引发ServerException(HTTP 500)。

    要模拟服务器停机情况,您可以编写一个ServerAlwaysDown类扩展实际服务器,但引发ServerException(HTTP 500)对于每个连接。

    在测试服务器关闭时,提供任何不正确的URL或端口(首选)。对于恢复,请提供正确的URL/端口。

    在测试服务器关闭时,请提供任何不正确的URL或端口(首选)。对于恢复,请提供正确的URL/端口。

    如果要彻底使用离生产环境最近的测试,请将客户端和服务器放在不同的机器上,切断连接,然后恢复连接。

    如果要彻底使用离生产环境最近的测试,将客户端和服务器放在不同的机器上,切断连接,然后恢复连接。

    基本思想是以某种方式模拟服务器的行为。你可以这样做

    您还可以创建用于测试目的的手动模拟。让客户端上服务器的“代理”实现此接口:

    public interface IServer
    {
        bool foo();
    }
    
    您可以创建该服务器的“假”实现,并返回您想要的任何内容

    public class FakeOfflineServer implements IServer
    {
        public bool foo()
        {
            // throw some exception here.
        }
    }
    
    此方法允许您伪造不同的场景(无网络连接、无效凭据等)

    您还可以在测试中使用组合从上到下切换:

    public bool FakeServer implements IServer
    {
        private IServer offline = new FakeOfflineServer();
        private IServer online = new Server();
    
        public bool isUp = false;
    
        private IServer getServer()
        {
            return isUp ? online : offline;
        }
    
        public bool foo()
        {
            return getServer().foo();
        }
    }
    
    基本思想是以某种方式模拟服务器的行为。你可以这样做

    您还可以创建用于测试目的的手动模拟。让客户端上服务器的“代理”实现此接口:

    public interface IServer
    {
        bool foo();
    }
    
    您可以创建该服务器的“假”实现,并返回您想要的任何内容

    public class FakeOfflineServer implements IServer
    {
        public bool foo()
        {
            // throw some exception here.
        }
    }
    
    此方法允许您伪造不同的场景(无网络连接、无效凭据等)

    您还可以在测试中使用组合从上到下切换:

    public bool FakeServer implements IServer
    {
        private IServer offline = new FakeOfflineServer();
        private IServer online = new Server();
    
        public bool isUp = false;
    
        private IServer getServer()
        {
            return isUp ? online : offline;
        }
    
        public bool foo()
        {
            return getServer().foo();
        }
    }
    

    这取决于测试的位置。如果您正在进行单元测试,最好的选择是Bryan Menard建议的模拟

    如果您在集成或生产环境中进行测试,实际上可以切断您与服务器之间的连接

    根据您的操作系统,您可以通过多种方式实现这一点

    对于基于Windows的系统来说,这是非常棒的。您几乎可以模拟任何情况,包括请求的延迟,甚至只是丢弃请求。它不需要Windows的管理员访问权限

    对于基于linux的系统,我过去使用过的一种技术是使用代理服务器,或者在操作系统级别切断端口。您可以使用iptables执行此操作,例如:

    拒绝访问特定端口(本例中为25)

    再次允许:

    /sbin/iptables --delete OUTPUT 1
    

    您需要root访问才能使其工作,但它的优点是您不需要接触服务器或客户端配置。

    这取决于您在哪里进行测试。如果您正在进行单元测试,最好的选择是Bryan Menard建议的模拟

    如果您在集成或生产环境中进行测试,实际上可以切断您与服务器之间的连接

    根据您的操作系统,您可以通过多种方式实现这一点

    对于基于Windows的系统来说,这是非常棒的。您几乎可以模拟任何情况,包括请求的延迟,甚至只是丢弃请求。它不需要Windows的管理员访问权限

    对于基于linux的系统,我过去使用过的一种技术是使用代理服务器,或者在操作系统级别切断端口。您可以使用iptables执行此操作,例如:

    拒绝访问特定端口(本例中为25)

    再次允许:

    /sbin/iptables --delete OUTPUT 1
    

    您需要根用户访问才能工作,但它的优点是您不需要接触服务器或客户端配置。

    在这种情况下,只需从客户端拔下网络电缆怎么样?!:)对有道理。这是另一种情况。虽然它们属于同一种情况:无法连接到服务器。在这种情况下,只需从客户端拔下网络电缆怎么样?!:)对有道理。这是另一种情况。虽然它们属于相同的场景:无法访问服务器。