使用Mockito进行JUnit测试-如何模拟javax.ws.rs.client.ClientRequestContext?
我有一个实现javax.ws.rs.client.ClientRequestFilter的类:使用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
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可能有一百万个原因