java - 模拟函数在指定 return 后返回 null

标签 java junit mockito

测试代码

    @Mock
    private RestTemplate restTemplate;

    @InjectMocks
    private ServiceClient client;

    @Test
    public void getDocument() throws IOException {
        String fileExtension = "fileextension";
        String host = "docserverurl";
        String path = "path";
        String content = "content";

        client = new ServiceClient(restTemplate, host, fileExtension);
        when(restTemplate.getForEntity(any(), any()))
                .thenReturn(new ResponseEntity(content, HttpStatus.OK));
        assertEquals(content, new String(client.getDocument(path)));
    }

以及被测试的代码

    public byte[] getDocument(String path) throws IOException {
        path = suffixWithExtension(path);
        return restTemplate.getForEntity(docServiceHost + DOC_SERVICE_API_VERSION_DEFAULT + DOCUMENT + path, byte[].class).getBody();
    }

由于某种原因,我遇到了一个问题,当在被测函数中调用 getForEntity 函数时,它返回 null 而不是模拟响应。

最佳答案

试试这个。这应该有效。

byte[] content = "content".getBytes();
when(restTemplate.getForEntity(anyString(), any()))
                .thenReturn(new ResponseEntity(content, HttpStatus.OK));
final byte[] sds = someClass.getDocument("sd");
assertEquals(new String(content), new String(sds));

一些提示。如果你正在这样做

client = new ServiceClient(restTemplate, host, fileExtension);

你不需要@InjectMocks。这是多余的。最佳实践是使用构造函数注入(inject),而不是使用字段注入(inject)和@InjectMocks。

我希望你的Mocks都被初始化了。这是通过

完成的
MockitoAnnotations.initMocks(this);

这也是通过一些 Runner 类完成的(如果您正在使用任何类)

关于java - 模拟函数在指定 return 后返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60979899/

相关文章:

java - 如何在 Java 上使用 for 循环显示数组的输出

java - Hazelcast 驱逐和分布式查询

java - 如何为套件中的所有测试用例应用 JUnit @Rule

java - 如何在 mockito 测试用例中模拟控制台用户输入

java - 使用 Java 1.5 在 Windows 中获取以太网适配器的 IPv4 地址

java - 找不到添加到我的自定义库的库

java - 我可以在一种测试方法中测试多个抛出的异常吗?

unit-testing - 使用mockito模拟HttpClient请求

java - 使模拟方法返回传递给它的参数

scala - 如何使用 Mockito 验证 Specs2 中特定字符串匹配器的调用