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

RestTemplate返回null时模拟

沈单弓
2023-03-14

我试图测试一个简单POST Rest调用,但存在NullPointerException。

我的RestController:

@RestController
@RequestMapping("/v1/mail")
@Slf4j
public class EmailForwardController {

    @Autowired
    EmailForwardConfig emailConfig;

    @Autowired
    RestTemplate restTemplate;

    @PostMapping("/forward")
    public ResponseEntity<String> setupEmailForward(@RequestParam String fromEmail, @RequestParam String toEmail, @RequestParam String referenceId) {
        log.info("Email Forward: from=" + fromEmail + " to=" + toEmail + " reference=" + referenceId);
        String uri = emailConfig.getUrl() + "forward";
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("from", fromEmail);
        jsonObject.put("to", toEmail);
        jsonObject.put("clientId", referenceId);
        HttpEntity<String> httpEntity = new HttpEntity<>(jsonObject.toJSONString());
        ResponseEntity<String> response = restTemplate.postForEntity(uri, httpEntity, String.class);
        System.out.println(response); // -> this is null at UNIT Test
        if (response.getBody() == null) {
            log.error("No response for call!");
            return new ResponseEntity<>("Problem!", HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<>(response.getBody(), response.getStatusCode());

    }

}

我的单元测试:

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest(classes = EmailForward.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class ServiceTest {

    @InjectMocks
    EmailForwardController emailForwardController;

    @Mock
    RestTemplate restTemplate;

    @Mock
    EmailForwardConfig emailConfig;

    @Before
    public void setup() {

    }

    @Test
    public void test_forward_ok() {
        assertNotNull(restTemplate);
        assertNotNull(emailForwardController);
//        System.out.println(Mockito.verify(restTemplate).postForEntity(any(), any(), any()));
        Mockito.when(restTemplate.postForEntity(any(), any(), any())).thenReturn(new ResponseEntity<>("done", HttpStatus.OK));
        ResponseEntity<String> responseEntity = emailForwardController.setupEmailForward("test", "test", "test");
        assertNotNull(responseEntity);
        assertNotNull(responseEntity.getStatusCode());
        assertNotNull(responseEntity.getBody());
        assertEquals(responseEntity.getBody(), "Done");
        assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);
    }


}

由于以下错误,此测试失败:NullPointerException,确切地说,response ResponseEntity对象为Null。

verify输出将执行以下操作:

Wanted but not invoked:
restTemplate.postForEntity(
    <any>,
    <any>,
    <any>
);
-> at xx.xxx.ms.oauth2.ServiceTest.test_forward_ok(ServiceTest.java:42)
Actually, there were zero interactions with this mock.

知道为什么响应是空的吗?我为测试使用了正确的注释,因此应该注入模拟。也许我在这里遗漏了一些重要的东西,因为如果我删除@mock EmailForwardConfig emailconfig;这个对象在RESTController中是空的。我觉得我忘记了什么,但我想不出来。

共有1个答案

钮勇
2023-03-14

您对RestTemplate.PostForEntity的嘲弄是不正确的。

将您得嘲讽更改为:

Mockito.when(restTemplate.postForEntity(any(), any(), any())).thenReturn(new ResponseEntity<>("done", HttpStatus.OK));

致:

Mockito.when(restTemplate.postForEntity(anyString(),any(),
                any(Class.class))).thenReturn(new ResponseEntity<>("done", HttpStatus.OK));
 类似资料:
  • 我试图模仿REST模板。通过mockito返回exchange方法,但无论我通过mock返回什么,它总是返回空值,即使我抛出异常: 这是实际代码: mockito代码: 在交换模拟中,每个参数都是ArgumentMatcher类型,mockLovList()返回一个LOV列表 它应该返回我嘲笑的任何东西,但它总是返回null

  • 我在遵循at spring网站的创业指南https://spring.io/guides/gs/consuming-rest/. 我没有遵循确切的教程,因为我正在使用另一个endpoint:http://www.omdbapi.com?s=rush. 我在将JSON转换为POJO时遇到了问题。我没有收到任何错误或异常。有人能指出我哪里做错了吗? 您可以在此处找到完整的代码 这是我的POJO: 这是

  • 我有两个活动和两个布局。当我在第一个活动中显示列表时,一切都正常,并在单击时给出列表中项目的编号,但当我尝试在第二个活动中重复相同的内容时,它会告诉我RecycleServiceClickListener侦听器为空。 适配器: 第一项活动: 第二项活动: 错误: 我不明白为什么在第一种情况下,它正常处理单击,而在第二种情况下,它说RecyclerViewClickListener为null

  • 我正在尝试对服务类进行单元测试,但模拟返回null 在上面的代码中,当调用到达服务类时为空。我不知道我是否错过了什么。我尝试使用和运行,但结果相同。感谢任何帮助。 提前谢谢你。

  • 问题内容: 说我有一些Java代码: 还有一些代码可以加载: 能永远?为什么/为什么不呢?如果是这样,在什么情况下? 问题答案: 根据此方法javadoc: 返回该类的类加载器。一些实现可能使用null来表示引导类加载器。如果此类是由bootstrap类加载器加载的,则此方法在此类实现中将返回null。

  • 你能告诉我如何只对某些代码块运行事务吗?我有@Transactional的服务函数,并从它们调用存储库函数,在那里执行查询。但当查询失败时,由于事务必须结束,服务功能也随之失效。那么,当存储库函数失败时,如何返回null值呢?我需要在失败时捕获空值,并继续一些逻辑。我的代码: 我尝试了@davidxxx的答案,得到了这个错误: