Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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
使用Mockito进行JUnit测试-如何模拟javax.ws.rs.client.ClientRequestContext?_Java_Mockito_Jax Rs_Junit5 - Fatal编程技术网

使用Mockito进行JUnit测试-如何模拟javax.ws.rs.client.ClientRequestContext?

使用Mockito进行JUnit测试-如何模拟javax.ws.rs.client.ClientRequestContext?,java,mockito,jax-rs,junit5,Java,Mockito,Jax Rs,Junit5,我有一个实现javax.ws.rs.client.ClientRequestFilter的类: public class CustomFilter implements ClientRequestFilter { @Override public void filter(ClientRequestContext context) throws IOException { URI newUri = ... //replace a new uri context.setUri(UR

我有一个实现javax.ws.rs.client.ClientRequestFilter的类:

public class CustomFilter implements ClientRequestFilter {

@Override
public void filter(ClientRequestContext context) throws IOException {
    URI newUri = ... //replace a new uri
    context.setUri(URI.create(newUri));

    if (context.getMethod == "POST") {
        context.setMethod("GET");
        context.getHeaders().putSingle("ID","some string");
    }
}
我想要的是以某种方式嘲弄ClientRequestContext。我想在调用filter函数后进行比较:

新uri设置正确。 新的http方法设置正确。 为上下文设置了一个新的标题ID和一些字符串。 正如我试图弄明白的,我只能模拟getter方法,我不知道如何正确地模拟ClientRequestContext并使用CustomerFilter类调用实际函数filter来更改ClientRequestContext对象的值,因为它是一个接口。你能帮我实现这3个要求吗?

类ClientRequestFilter是一个接口,因此你可以使用静态Mockito.mock方法或在测试中将字段注释为@mock来模拟它。因此,如果要检查是否调用了setUri方法,应在测试方法中执行以下操作:

CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(ArgumentMatchers.any(URI.class));
对于较旧的Mockito版本:

CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(Matchers.any());
您不必验证底层实现是否正常工作。因为您使用的是一个接口,所以您将相信您在运行时拥有的实现是正确的,因为不需要测试您的依赖关系。您只需确保您编写的代码正常工作,并将请求转发给其他类

以类似的方式,您可以测试其他要求:

Mockito.when(context.getMethod()).thenReturn("POST");
MultivaluedMap headers = Mockito.mock(MultivaluedMap.class);
Mockito.when(context.getHeaders()).thenReturn(headers);
CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(Matchers.any());
Mockito.verify(context, Mockito.once()).setMethod(Matchers.any());
Mockito.verify(context, Mockito.once()).getHeaders();
类ClientRequestFilter是一个接口,因此您可以使用静态Mockito.mock方法或在测试中将字段注释为@mock来模拟它。因此,如果要检查是否调用了setUri方法,应在测试方法中执行以下操作:

CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(ArgumentMatchers.any(URI.class));
对于较旧的Mockito版本:

CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(Matchers.any());
您不必验证底层实现是否正常工作。因为您使用的是一个接口,所以您将相信您在运行时拥有的实现是正确的,因为不需要测试您的依赖关系。您只需确保您编写的代码正常工作,并将请求转发给其他类

以类似的方式,您可以测试其他要求:

Mockito.when(context.getMethod()).thenReturn("POST");
MultivaluedMap headers = Mockito.mock(MultivaluedMap.class);
Mockito.when(context.getHeaders()).thenReturn(headers);
CustomFilter customFilter = new CustomFilter();
customFilter.filter(context);
Mockito.verify(context, Mockito.once()).setUri(Matchers.any());
Mockito.verify(context, Mockito.once()).setMethod(Matchers.any());
Mockito.verify(context, Mockito.once()).getHeaders();

您可以使用参数mockito匹配器和/或参数捕获器。或者为请求上下文编写一个存根并监视它:

package test;

import org.junit.Test;

import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import java.net.URI;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;

public class ClientRequestContextTest {

    abstract static class ClientRequestContextStub implements ClientRequestContext {
        MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
        URI uri = null;
        String method = null;
        ClientRequestContextStub(){}
        @Override public String getMethod() { return method; }
        @Override public void setMethod(String method) { this.method = method; }
        @Override public URI getUri() { return uri; }
        @Override public void setUri(URI uri) { this.uri = uri; }
        @Override public MultivaluedMap<String, Object> getHeaders() { return headers; }
    }

    static class CustomFilter implements ClientRequestFilter {
        private String newUri = null;
        CustomFilter(String newUri) { this.newUri = newUri; }
        @Override
        public void filter(ClientRequestContext context) throws IOException {
            context.setUri(URI.create(newUri));
            if (context.getMethod().equals("POST")) {
                context.setMethod("GET");
                context.getHeaders().putSingle("ID", "some string");
            }
        }
    }

    @Test
    public void checkCustomFilter() throws IOException {
        URI newUriValue = URI.create("https://user:password@localhost:12345/suffix");
        ClientRequestContext context = spy(ClientRequestContextStub.class);
        context.setUri(URI.create("localhost:8080"));
        context.setMethod("POST");
        assertThat(context.getMethod(), equalTo("POST"));
        assertThat(context.getUri().toString(), equalTo("localhost:8080"));
        assertThat(context.getHeaders().size(), equalTo(0));
        new CustomFilter(newUriValue.toString()).filter(context);
        assertThat(context.getMethod(), equalTo("GET"));
        assertThat(context.getUri(), equalTo(newUriValue));
        assertThat(context.getHeaders().size(), equalTo(1));
        assertThat(context.getHeaders().getFirst("ID").toString(), is("some string"));
    }
}


您可以使用参数mockito匹配器和/或参数捕获器。或者为请求上下文编写一个存根并监视它:

package test;

import org.junit.Test;

import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import java.net.URI;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;

public class ClientRequestContextTest {

    abstract static class ClientRequestContextStub implements ClientRequestContext {
        MultivaluedMap<String, Object> headers = new MultivaluedHashMap<>();
        URI uri = null;
        String method = null;
        ClientRequestContextStub(){}
        @Override public String getMethod() { return method; }
        @Override public void setMethod(String method) { this.method = method; }
        @Override public URI getUri() { return uri; }
        @Override public void setUri(URI uri) { this.uri = uri; }
        @Override public MultivaluedMap<String, Object> getHeaders() { return headers; }
    }

    static class CustomFilter implements ClientRequestFilter {
        private String newUri = null;
        CustomFilter(String newUri) { this.newUri = newUri; }
        @Override
        public void filter(ClientRequestContext context) throws IOException {
            context.setUri(URI.create(newUri));
            if (context.getMethod().equals("POST")) {
                context.setMethod("GET");
                context.getHeaders().putSingle("ID", "some string");
            }
        }
    }

    @Test
    public void checkCustomFilter() throws IOException {
        URI newUriValue = URI.create("https://user:password@localhost:12345/suffix");
        ClientRequestContext context = spy(ClientRequestContextStub.class);
        context.setUri(URI.create("localhost:8080"));
        context.setMethod("POST");
        assertThat(context.getMethod(), equalTo("POST"));
        assertThat(context.getUri().toString(), equalTo("localhost:8080"));
        assertThat(context.getHeaders().size(), equalTo(0));
        new CustomFilter(newUriValue.toString()).filter(context);
        assertThat(context.getMethod(), equalTo("GET"));
        assertThat(context.getUri(), equalTo(newUriValue));
        assertThat(context.getHeaders().size(), equalTo(1));
        assertThat(context.getHeaders().getFirst("ID").toString(), is("some string"));
    }
}


我在Mockito依赖项中找不到ArgumentMatchers。我在这里使用mockito all 1.10.19。您使用的是哪个版本?此外,当我尝试调用customFilter.filtercontext时,似乎遇到了NulllPointerException。我已经声明了ClientRequestContext=mockClientRequestContext.class;检查我的ArgumentMatchers更新。对于NullPointerException,您应该检查stacktrace,NullPointerException可能有一百万个原因,我在Mockito依赖项中找不到ArgumentMatchers。我在这里使用mockito all 1.10.19。您使用的是哪个版本?此外,当我尝试调用customFilter.filtercontext时,似乎遇到了NulllPointerException。我已经声明了ClientRequestContext=mockClientRequestContext.class;检查我的ArgumentMatchers更新。对于NullPointerException,您应该检查stacktrace,NullPointerException可能有一百万个原因