当前位置: 首页 > 知识库问答 >
问题:

如何修复Mockito测试中RestTemplate.exchange的空值响应?

岑炯
2023-03-14

我的服务级别如下,接下来是测试-

@Service
public class MyServiceImpl implements MyService {

        @Autowired
        private RestTemplate restTemplate;

        @Override
        public StudentInfo getStudentInfo(String name) {
            HttpHeaders headers = new HttpHeaders();
            headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);

            HttpEntity entity = new HttpEntity(headers);

            StudentInfo student = null;

            URI uri = new URI("http:\\someurl.com");             

           ResponseEntity<String> responseEntity = restTemplate.exchange(uri,
                        HttpMethod.GET, entity,
                        String.class);

           if (responseEntity.getStatusCode().equals(HttpStatus.NO_CONTENT)) {
                   throw new Exception("Student absent");
            }else {
              ObjectMapper mapper = new ObjectMapper();
              StudentInfo student = mapper.readValue(responseEntity.getBody(), StudentInfo.class);

           }

            return student;
        }
    }

测试类:在我下面的测试类中,我在调试时将响应实体对象视为null,这会导致NPE。

@RunWith(MockitoJUnitRunner.class)
public class MyServiceImplTest {

    @InjectMocks
    private MyService service = new MyServiceImpl();

    @Mock
    private RestTemplate restTemplate;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testStudentGetterResponse() {

        ResponseEntity<String> mockEntity = Mockito.spy(new ResponseEntity({"id" : 1, "name" : "Rutzen"}, HttpStatus.OK));

        doReturn(mockEntity).when(restTemplate).exchange(any(URI.class), any(HttpMethod.class), any(ResponseEntity.class),
                any(Class.class));

        StudentInfo info = service.getStudentInfo("testuser");

        Assert.assertNotNull(info);


    }

}

当我调试测试时,我在主服务类的以下行中获得了一个空值——

 ResponseEntity<String> responseEntity = restTemplate.exchange(uri,
                        HttpMethod.GET, entity,
                        String.class);

共有3个答案

崔宜修
2023-03-14
 ResponseEntity<String> responseEntity = restTemplate.exchange(uri,
                        HttpMethod.GET, entity,
                        String.class);

如果出现字符串[],我将不工作

喜欢

ResponseEntity<String[]> responseEntity = restTemplate.exchange(uri,
                        HttpMethod.GET, entity,
                        String[].class);
龚星洲
2023-03-14

因为公认的答案是正确的。我在给已经被接受的答案添加一些东西。

这似乎有点奇怪,但我通过查看已接受的答案解决了这个问题,并由提出问题的用户添加了评论。

换掉这个

doReturn(mockEntity).when(restTemplate).exchange(
    any(URI.class), 
    any(HttpMethod.class), 
    any(ResponseEntity.class),              
    any(Class.class)
);

具有

doReturn(mockEntity).when(restTemplate).exchange(
    any(URI.class), 
    any(HttpMethod.class), 
    any(HttpEntity.class),              
    any(Class.class)
);

如果仍然出现错误,则不要使用多行。只使用一条线,并按如下方式更换。

doReturn(mockEntity).when(restTemplate).exchange(any(URI.class), any(HttpMethod.class), any(HttpEntity.class), any(Class.class)
);
秋向阳
2023-03-14

这个指令。。。

doReturn(mockEntity).when(restTemplate).exchange(
    any(URI.class), 
    any(HttpMethod.class), 
    any(ResponseEntity.class),              
    any(Class.class)
);

... 应替换为:

doReturn(mockEntity).when(restTemplate).exchange(
    any(URI.class), 
    any(HttpMethod.class), 
    any(HttpEntity.class),              
    any(Class.class)
);

因为getStudentInfo()创建了HttpEntity(而不是ResponseEntity)的一个实例,然后将其传递给restTemplate。exchange()调用。

 类似资料:
  • 我在我的Java,Spring Boot控制器中创建了一个函数,它允许我根据参数获得数据的和值,这很有效。然而,我很难理解用Junit和Mockito测试这个功能的最佳方式是什么?到目前为止,我已经创建了一个测试函数,它返回一个特定数组字段的值。如何能够返回。thenreturn()中的值,该值根据给定的serviceID求和?任何帮助或建议任何其他有用的帖子将被感谢,因为我无法找到任何相关的或我

  • 我有一个类需要进行单元测试: 我有一个测试用例: 当我运行测试用例时,没有使用ActiveMQConnectionFactory的模拟对象。相反,正在使用实际的实现,并且正在建立TCP连接: 我尝试了Powermockito和Mockito,但都失败了。如何模拟对象,如何成功运行测试用例? 我是单元测试新手,试图从各个社区获得帮助,但没有找到合适的答案。任何帮助都将不胜感激。谢谢

  • 我正试图在wordpress上制作一个响应性主题。当我使用桌面分辨率时,缩略图会100%调整到卡的分辨率,但当我将分辨率降低到移动设备时,它会变得比卡更大。为什么会这样? 我已经尝试添加Bootstrap4响应映像类。 预期: 现实: wordpress管理面板上配置的缩略图大小为350 x273px

  • Mocking resttemplate.exchange()不起作用。restTemplate.exchange()mocking的响应在BDS适配器类中给出null值。我的测试用例由于BDSAdapter类中的空指针异常而失败。(response.getStatusCodeValue()提供空指针异常。.mockito提示) 未使用...->at com..policydetails_adap

  • 问题内容: 假设我有这个对象objectDemo,它使用2个参数String和null调用方法objectDemoMethod。现在,我想验证此方法是通过Mockito调用的: 我写了这个: 但它给出了一个错误: 为空值无效使用参数匹配器。 还有其他方法可以传递空值吗? 问题答案: 由于您仅对一个参数使用参数匹配器,而对另一个参数不使用参数,这是您收到的错误消息。从Javadoc: 如果使用参数匹

  • 我有简单的asmx返回JSON: C#类定义: 使用jquery$调用。ajax: 我的JSON响应(带有不需要的空值): {“PropertyA”:“1”,“PropertyB”:null,“PropertyC”:“1”,“PropertyD”:null} 问:如何仅使用JSON中的非空属性,尽可能多地使用我已经拥有的内容? 我在这里看到了一些答案,人们返回JSON对象和用JSON属性定义的属性