如何模拟REST模板交换?

Akk*_*rek 23 java junit mockito spring-boot

我有一项服务,我需要通过休息询问外部服务器以获取一些信息:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我该如何编写JUnit测试getListofObjectsA()

我试过以下:

@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));
}
Run Code Online (Sandbox Code Playgroud)

但是上面的代码不起作用,那就说明responseEntittynull.如何正确模拟我的测试restTemplate.exchange

Min*_*gas 25

你不需要MockRestServiceServer对象.注释@InjectMocks不是@Inject.下面是一个应该有效的示例代码

@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));
    }
Run Code Online (Sandbox Code Playgroud)

  • @Angelina,因为它是一个真实的对象,所以只使用一个适当的构造函数,即`ResponseEntity(T body,HttpStatus status)` (3认同)
  • 我们如何将内容添加到myEntity.getBody()?我的回来了null (2认同)
  • 不推荐使用匹配器,您应该使用 Mockito (2认同)

Shy*_*lli 17

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);
Run Code Online (Sandbox Code Playgroud)

  • "Matchers"已弃用,因"名称冲突"而应替换为"ArgumentMatchers".[Class Matchers](https://static.javadoc.io/org.mockito/mockito-core/2.21.0/org/mockito/Matchers.html) (3认同)

its*_*ata 14

这是未处理的ArgumentMatchers类的示例

when(restTemplate.exchange(
                ArgumentMatchers.anyString(),
                ArgumentMatchers.any(HttpMethod.class),
                ArgumentMatchers.any(),
                ArgumentMatchers.<Class<String>>any()))
             .thenReturn(responseEntity);
Run Code Online (Sandbox Code Playgroud)

  • 您也可以将它与通用匹配器一起使用。ArgumentMatchers.&lt;Class&lt;?&gt;&gt;any()) (3认同)

Abb*_*ese 7

对我来说,我必须使用Matchers.any(URI.class)

Mockito.when(restTemplate.exchange(Matchers.any(URI.class), Matchers.any(HttpMethod.class), Matchers.<HttpEntity<?>> any(), Matchers.<Class<Object>> any())).thenReturn(myEntity);
Run Code Online (Sandbox Code Playgroud)


che*_*ndu 5

这项工作在我这边。

ResourceBean resourceBean = initResourceBean();
ResponseEntity<ResourceBean> responseEntity  
    = new ResponseEntity<ResourceBean>(resourceBean, HttpStatus.ACCEPTED);
when(restTemplate.exchange(
    Matchers.anyObject(), 
    Matchers.any(HttpMethod.class),
    Matchers.<HttpEntity> any(), 
    Matchers.<Class<ResourceBean>> any())
 ).thenReturn(responseEntity);
Run Code Online (Sandbox Code Playgroud)