使用Mockito模拟服务器

问题描述:

我想测试服务器是否会返回字符串。但是,我想测试它而不实际连接到服务器。我试图摆脱通过嘲笑服务器的java.net.SocketException。我应该怎么做?使用Mockito模拟服务器

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

@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 
+0

你在测试什么?你是否试图嘲笑服务器的结果?这里有很多相互依赖的代码,所以我不能100%清楚你想要测试的是什么。 – Makoto

+0

@Makoto是的,我试图从服务器嘲笑结果。 – user3720852

我用wiremock,效果良好。这是专门为这项工作设计的模拟框架。

您也可以使用JBoss并运行该项目。当嘲笑服务器时,你需要使用@Bohemian所说的内容,因为它更容易。然而,学习曲线很高,不建议在紧急情况下(我是一个新手btw)。