我有一项服务,我需要通过rest向外部服务器询问一些信息:
public class SomeService {
public List<ObjectA> getListofObjectsA() {
List<ObjectA> objectAList = new ArrayList<ObjectA>();
ParameterizedTypeReference<List<ObjectA>> typeRef = new ParameterizedTypeReference<List<ObjectA>>() {};
ResponseEntity<List<ObjectA>> responseEntity = restTemplate.exchange("/objects/get-objectA", HttpMethod.POST, new HttpEntity<>(ObjectAList), typeRef);
return responseEntity.getBody();
}
}
如何为getListofObjectsA()编写JUnit测试?
我尝试了以下方法:
@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest {
private MockRestServiceServer mockServer;
@Mock
private RestTemplate restTemplate;
@Inject
private SomeService underTest;
@Before
public void setup() {
mockServer = MockRestServiceServer.createServer(restTemplate);
underTest = new SomeService(restTemplate);
mockServer.expect(requestTo("/objects/get-objectA")).andExpect(method(HttpMethod.POST))
.andRespond(withSuccess("{json list response}", MediaType.APPLICATION_JSON));
}
@Test
public void testGetObjectAList() {
List<ObjectA> res = underTest.getListofObjectsA();
Assert.assertEquals(myobjectA, res.get(0));
}
然而,上面的代码不起作用,它表明responseEntity
为null
。如何更正测试以正确模拟restTemplate。交换?
ResponseEntity<String> responseEntity = new ResponseEntity<String>("sampleBodyString", HttpStatus.ACCEPTED);
when(restTemplate.exchange(
Matchers.anyString(),
Matchers.any(HttpMethod.class),
Matchers.<HttpEntity<?>> any(),
Matchers.<Class<String>> any()
)
).thenReturn(responseEntity);
这是一个未弃用的ArgumentMatcher类的示例
when(restTemplate.exchange(
ArgumentMatchers.anyString(),
ArgumentMatchers.any(HttpMethod.class),
ArgumentMatchers.any(),
ArgumentMatchers.<Class<String>>any()))
.thenReturn(responseEntity);
您不需要MockRestServiceServer对象。注释是InjectMocks,而不是InjectMocks。下面是一个应该可以工作的示例代码
@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest {
@Mock
private RestTemplate restTemplate;
@InjectMocks
private SomeService underTest;
@Test
public void testGetObjectAList() {
ObjectA myobjectA = new ObjectA();
//define the entity you want the exchange to return
ResponseEntity<List<ObjectA>> myEntity = new ResponseEntity<List<ObjectA>>(HttpStatus.ACCEPTED);
Mockito.when(restTemplate.exchange(
Matchers.eq("/objects/get-objectA"),
Matchers.eq(HttpMethod.POST),
Matchers.<HttpEntity<List<ObjectA>>>any(),
Matchers.<ParameterizedTypeReference<List<ObjectA>>>any())
).thenReturn(myEntity);
List<ObjectA> res = underTest.getListofObjectsA();
Assert.assertEquals(myobjectA, res.get(0));
}
我现在在运行时看到.Intercept正在获得null对象值。 有人能建议我怎么修理吗。
我在JUnit中使用Mockito,并且我有一个使用RestTemboard向微服务发出请求的方法。 此方法返回一个JSON对象,该对象将在TokenRequestorPayload类中反序列化。 当我执行单元测试时,它们会失败,因为mock不起作用,我得到了一个org.springframework.web.client.ResourceAccessExcure。我怎么能嘲笑我的RestTem板
Spring参考提到应该通过进行定制。如何用一个构建器管理来自多个IP地址的多个URI? 如何通过向所有全局添加,这是一个好的实践吗? 多谢帮忙。 我考虑为每个服务器设置一个。我不想手动执行此操作--我更喜欢使用Spring机制。 有人帮忙吗?
我需要对一个方法进行unittest,该方法有2个rest调用和另一个方法调用。详细描述如下: 现在,对于methB和methC方法,我用这里给出的解决方案模拟了rest调用。但是使用methA()我无法为两种不同类型(GET和POST)的两个不同REST调用修补mock。模拟此场景的可能解决方案是什么?提前通知。
我实现了一个模块来使用rest webservice(Json)并在oracle数据库中持久化。我只在Spring IOC上工作,但可以使用Spring BootRest模板和Spring数据JPA快速开发它。班级数量非常少。 对于json到java对象的转换,我使用http://www.jsonschema2pojo.org/并将所有生成的java对象复制到我的项目中。现在,我想包括logic/
我试图理解restTemplate上可用的readTimeout,它到底是什么? 它是请求在我们得到超时异常之前可以花费的总时间吗?