使用 Mockito 模拟服务器

Posted

技术标签:

【中文标题】使用 Mockito 模拟服务器【英文标题】:Mock a server using Mockito 【发布时间】:2014-06-09 03:45:12 【问题描述】:

我正在尝试测试服务器是否会返回字符串。但是,我想在不实际连接到服务器的情况下对其进行测试。我试图通过模拟服务器来摆脱 java.net.SocketException 。我应该怎么做?

下面的代码声明了服务器的所有必要值。

@RunWith(MockitoJUnitRunner.class)
public class testTransfer 



@Test
public void getServerMessage() 
    //variables
    String serverhostname = "serverA";
    int portNo = 8888;
    int versionNo = 9999;
    String protocol = "tcp";
    String serverInput = "input string";

    String url = "http://localhost:8080/server/url";


    Service service =new Service();
    Call call = Mockito.mock(Call.class);
    server_string result = Mockito.mock(server_string.class);

下面的代码调用服务器并在 xml 中添加值。

    //try catch
        try 

        call=(Call)service.createCall();
        QName qn = new QName("urn:ServerApiService", "server_string" );
        call.registerTypeMapping(server_string.class, qn,
                new org.apache.axis.encoding.ser.BeanSerializerFactory(server_string.class, qn),
                new org.apache.axis.encoding.ser.BeanDeserializerFactory(server_string.class, qn));

        call.setTargetEndpointAddress( new java.net.URL(url) );
        call.addParameter("arg1", XMLType.XSD_STRING, ParameterMode.IN);
        call.addParameter("arg2", XMLType.XSD_INT, ParameterMode.IN);
        call.addParameter("arg3", XMLType.XSD_INT, ParameterMode.IN);
        call.addParameter("arg4", XMLType.XSD_STRING, ParameterMode.IN);
        call.addParameter("arg5", XMLType.XSD_STRING, ParameterMode.IN);
        call.addParameter("arg6", qn, ParameterMode.OUT);
        call.setOperationName( new QName(url, "getServerMessage") );
        call.setReturnClass(server_string.class);
        //result = (server_string) call.invoke( new Object[] serverhostname,portNo,versionNo,protocol,serverInput );
        result = (server_string) Mockito.when(call.invoke( new Object[] serverhostname,portNo,versionNo,protocol,serverInput )).thenReturn(server_string.class);
        System.out.println("Get server_string object from server ....");
                   // System.out.println("Value is "+result.value);
     catch (ServiceException e) 
        e.printStackTrace();
     catch (MalformedURLException e) 
        e.printStackTrace();
     catch (RemoteException e) 
        e.printStackTrace();
    





但是,我不断收到这个

AxisFault
 faultCode: http://schemas.xmlsoap.org/soap/envelope/Server.userException
 faultSubcode: 
 faultString: java.net.SocketException: Connection reset
 faultActor: 
 faultNode: 
 faultDetail: 
    http://xml.apache.org/axis/stackTrace:java.net.SocketException: Connection reset

【问题讨论】:

您实际测试的是什么?您是否尝试从服务器模拟结果?这里有很多相互依赖的代码,所以我不是 100% 清楚你要测试是什么。 @Makoto 是的,我正在尝试模拟从服务器返回的结果。 【参考方案1】:

我使用wiremock 效果很好。这是一个专门针对这项工作的模拟框架。

【讨论】:

【参考方案2】:

您也可以使用 JBoss 并运行该项目。模拟服务器时,您需要使用@Bohemian 所说的内容,因为这样更容易。但是,学习曲线很高,不建议在紧急情况下使用(顺便说一句,我是新手)。

【讨论】:

以上是关于使用 Mockito 模拟服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mockito 框架模拟我的服务

在另一个服务类 Mockito 中模拟具有依赖关系的服务类

使用MockIto模拟声明

如何使用 mockito 模拟方法?

Mockito:参数的模拟服务抛出空指针异常

使用 Mockito 在客户端测试 POST 请求