PowerMock/Mockito 无法获取 Class 中的 mock 值

问题描述 投票:0回答:0

我模拟了 QueryService,通过 when/doReturn 为查询服务中的函数设置返回值, 并在我运行测试时发现

ResultDTO<ResponseDTO> result
为空。 我是单元测试的新手,所以不确定哪一部分出了问题。

这是我的课程:

package com.infrastructure.api.acl;


@Service
public class ObjectiveClass {

    @Autowired
    private QueryService queryService;

    public ResultDTO<ResponseDTO> doCoolThings(Request request) {
        ResultDTO<ResponseDTO> result;
        QueryRequest queryRequest = JSON.parseObject(request.getQueryString(), QueryRequest.class);
        if (conditions) {
            result = queryService.doSomeThing(queryRequest);
        } else {
            // ... throw new Exception();
        }
        if (result == null) {
            // ... throw new Exception();
        }
        return result;
    }
}

我的测试班:

package com.infrastructure.api.acl;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.mockito.ArgumentMatchers.*;

@RunWith(PowerMockRunner.class)
public class ObjectiveClassTest {

    @Mock
    private QueryService queryService;

    @InjectMocks
    private ObjectiveClass objectiveClass;

    @Test
    public void testDoSomeThingWithFailedResponse_ShouldReturnFailedResultDTO() {
        this.setupReturnValue(false);
        ResultDTO<ResponseDTO> result = objectiveClass.doCoolThings(this.getRequestDTO());
        Assert.assertFalse(result.isSuccess());
    }

    private Request getRequestDTO() {
        Request result = new Request();
        result.setAbcd("abcd");
        // .. result.setParam
        return result;
    }

    public void setupReturnValue(boolean success) {
        if (success) {
            Mockito.when(queryService.doSomeThing(any(QueryRequest.class))).thenReturn(this.getResultDTO(true));
        } else {
            Mockito.when(queryService.doSomeThing(any(QueryRequest.class))).thenReturn(this.getResultDTO(false));
        }
    }

    private ResultDTO<ResponseDTO> getResultDTO(boolean success) {
        ResponseDTO response = this.getResponseDTO();
        if (success) {
            response.setSuccess(true);
            response.setErrorCode(0);
        } else {
            response.setSuccess(false);
            response.setErrorCode(999);
        }
        return response.isSuccess() ? ResultDTO.success(response) :
                ResultDTO.fail(response.getErrorCode(), response.getErrorMessage(), response);
    }

    private ResponseDTO getResponseDTO() {
        ResponseDTO result = new ResponseDTO();
        result.setAbc("abc")
        // .. result.setSomething()
        return result;
    }
}

我试着补充

@Spy 
private ResultDTO<ResponseDTO> response = new ResultDTO<>();

但是当我在调试模式下运行测试时它仍然为空。 谢谢

java mockito powermock
© www.soinside.com 2019 - 2024. All rights reserved.