Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟静态方法调用时发生意外调用_Java_Mocking_Jmockit_Expectations - Fatal编程技术网

Java 模拟静态方法调用时发生意外调用

Java 模拟静态方法调用时发生意外调用,java,mocking,jmockit,expectations,Java,Mocking,Jmockit,Expectations,我正在尝试使用JMockit测试一个静态方法。此方法使用实用程序类静态方法 测试运行时,JMockit会投诉并引发以下异常: Test set: com.company.pkg.subpkg.mylib.test.ServiceCommunicationTest -------------------------------------------------------------------- Tests run: 1, Failures: 0, Errors: 1, Ski

我正在尝试使用JMockit测试一个静态方法。此方法使用实用程序类静态方法

测试运行时,JMockit会投诉并引发以下异常:

Test set: com.company.pkg.subpkg.mylib.test.ServiceCommunicationTest -------------------------------------------------------------------- Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.086 sec FAILURE! testMakeResourceRequestPositive(com.company.pkg.subpkg.mylib.test.ServiceCommunicationTest) Time elapsed: 0.085 sec ERROR! mockit.internal.UnexpectedInvocation: Parameter "requestToSend" of com.company.pkg.subpkg.mylib.NetworkUtil#sendHttpRequest(org.apache.http.client.methods.HttpUriRequest requestToSend) expected GET https://localhost HTTP/1.1, got GET https://localhost HTTP/1.1 at com.company.pkg.subpkg.mylib.NetworkUtil.sendHttpRequest(NetworkUtil.java) at com.company.pkg.subpkg.mylib.serviceaccess.client.ServiceCommunicator.makeResourceRequest(ServiceCommunicator.java:57) at com.company.pkg.subpkg.mylib.test.ServiceCommunicationTest.testMakeResourceRequestPositive(ServiceCommunicationTest.java:79) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.lang.reflect.Method.invoke(Method.java:606) . . . . . . 令人困惑的是,预期字符串和实际字符串(如异常中报告的)是相同的-

expected GET https://localhost HTTP/1.1 got GET https://localhost HTTP/1.1 上述方法引用的实用程序类是-



    public final class NetworkUtil {

        // Prevent Instance Creation …
        private NetworkUtil() {
        }

        public  static  ResourcesDTO  makeResourceRequest(String  rootUri)  throws  IOException {

            NetworkUtil.validateStringInput(rootUri, "rootUri");

            // Preparing HTTP Request ...
            HttpUriRequest requestToSend = new HttpGet(rootUri);

            // Headers that needs to be set ...
            requestToSend.addHeader(HttpHeaders.ACCEPT,   MimeConstants.CONTENT_TYPE_STRING);

            // Send Request to the Server ...
            String response = NetworkUtil.sendHttpRequest(requestToSend);

            // Got the response, construct a DTOs out of it ...
            StringReader reader = new StringReader(response);

            // Convert the JSON response to appropriate DTO ...
            ObjectMapper mapper = new ObjectMapper();
            ResourcesDTO resourcesDto = mapper.readValue(reader, ResourcesDTO.class);

            return resourcesDto;
        }
    }


有人能看到这里发生了什么吗?

最后,我找到了这个意外调用异常的原因

NetworkUtil.sendHttpRequest((HttpUriRequest) any);
returns(jsonResponse);
如上图所示,我在返回之前更改了期望块中的行。我不再传递HttpUriRequest类型的对象,而是告诉JMockit任何HttpUriRequest类型的对象都是可以接受的


我相信,JMockit对模拟API调用的参数执行equals()。这里的问题可能是HttpUriRequest deosn没有实现自己的equals()方法,而是从对象继承。这意味着它实际上是在执行一个object1==object2。

最后,我能够确定这个意外调用异常的原因

NetworkUtil.sendHttpRequest((HttpUriRequest) any);
returns(jsonResponse);
如上图所示,我在返回之前更改了期望块中的行。我不再传递HttpUriRequest类型的对象,而是告诉JMockit任何HttpUriRequest类型的对象都是可以接受的

我相信,JMockit对模拟API调用的参数执行equals()。这里的问题可能是HttpUriRequest deosn没有实现自己的equals()方法,而是从对象继承。这意味着它实际上是在做一个object1==object2。

是的,JMockit(或任何其他模拟API)使用标准的“equals(obj)”方法比较记录的期望值的参数。事实上,测试中使用的HttpGet类既没有实现“equals”,也没有实现它的任何超类。如果需要,您可以使用在“NetworkUtil.sendHttpRequest(with(new Delegate(){…}))”调用中创建的自定义参数匹配器来比较两个对象(用于记录期望的对象和在测试代码中实际使用的对象)的各个属性/字段使用标准的“equals(obj)”方法比较记录的期望值的参数。事实上,测试中使用的HttpGet类既没有实现“equals”,也没有实现它的任何超类。如有必要,您可以使用在“NetworkUtil.sendHttpRequest(with(new Delegate(){…})”调用中创建的自定义参数匹配器来比较两个对象(用于记录期望的对象和在测试代码中实际使用的对象)的各个属性/字段。
NetworkUtil.sendHttpRequest((HttpUriRequest) any);
returns(jsonResponse);