Java 如何初始化JAX-RS HttpHeader

Java 如何初始化JAX-RS HttpHeader,java,unit-testing,jax-rs,Java,Unit Testing,Jax Rs,我有一个内部框架,其类如下所示: public abstract class POSEnterpriseResource extends SynchronousResource { ... @Inject protected HttpHeaders headers; ... } 我需要为一个类编写单元测试,该类将其扩展为使用如下代码 String acceptMediaType = headers.getHeaderString("Accept"); String accept

我有一个内部框架,其类如下所示:

public abstract class POSEnterpriseResource extends SynchronousResource {
  ...
  @Inject
  protected HttpHeaders headers;
  ...
}
我需要为一个类编写单元测试,该类将其扩展为使用如下代码

String acceptMediaType = headers.getHeaderString("Accept");
String acceptVersion = headers.getHeaderString("Accept-Version");
所讨论的HttpHeaders类型是
javax.ws.rs.core.HttpHeaders
下的一个接口,它不公开任何初始化方法,只公开getter。我无法接触现有代码


如何模拟这样的headers对象而不设置整个ResponseEntity

您可以使用类似的模拟库。下面是如何设置测试

//设置运行程序,以便Mockito处理所有
//初始化和注入
@RunWith(MockitoJUnitRunner.class)
公共类测试{
//HttpHeaders被模拟并注入到测试中
@嘲弄
私有HttpHeader;
//HttpHeaders被注入到资源类字段中
@注射模拟
私有测试资源;
@试验
公共void testHttpHeaders(){
//控制调用某些方法时模拟返回的内容
when(headers.getHeaderString(“X-Test”))。然后返回(“X-Test-Value”);
}
}
下面是一个完整的测试,向您展示使用库进行测试的一般方法。如果您以前从未使用过该库,我建议您花些时间浏览文档。学习基础知识很容易

import javax.inject.inject;
导入javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.products;
导入javax.ws.rs.core.HttpHeaders;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.mockito.InjectMocks;
导入org.mockito.Mock;
导入org.mockito.junit.MockitoJUnitRunner;
导入静态org.assertj.core.api.Assertions.assertThat;
导入静态org.mockito.mockito.when;
@RunWith(MockitoJUnitRunner.class)
公共类测试{
@嘲弄
私有HttpHeader;
@注射模拟
私有测试资源;
@试验
公共void testHttpHeaders(){
when(headers.getHeaderString(“X-Test”))。然后返回(“X-Test-Value”);
字符串响应=resource.get();
资产(响应)。isEqualTo(“X测试值”);
}
@路径(“测试”)
公共静态类TestResource{
@注入
私有HttpHeader;
@得到
@生成(“文本/纯文本”)
公共字符串get(){
返回headers.getHeaderString(“X-Test”);
}
}
}

使用Mockito,您可以模拟getX方法的行为,以完全按照您的需要返回存根。我觉得保罗的回答足够完整。此外,mockito.mock实际上允许您模拟接口。

我正在使用一些复杂的遗留代码,这些代码与mockito注入一起工作,但我想这是正常情况下的解决方案。您是否已经在使用运行程序进行测试了?有时使用多个跑步者可能会相互冲突。你不必使用跑步者。您可以使用手动执行注射。也试着使用
@规则
,就像在底部一样。不幸的是,我正在测试的类本身有点不寻常,我认为我不能在这里很好地表达它。我最后用“代码> >配置BabeStudiabeBeaNe//Cudio手动创建bean”,也考虑了构造函数注入而不是字段注入。在这种情况下,最好采用这种方法;当使用构造函数注入时,单元测试要容易得多。您可以模拟所有依赖项,只需实例化要测试的类,并传入所有模拟。甚至使用setter注入。在进行测试时,现场注入是最不可取的。