Нулевое исключение при издевательстве над сервисом Spring в тесте - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь смоделировать службу Spring и использовать веб-контекст MVC для проверки правильности ответа JSON-объект возвращается из контроллера.Кажется, что исключение поймано в контроллере, но указывает на нуль, таким образом возвращая неудачный ответ без тела.

Я не уверен, какую аннотацию я могу здесь пропустить.Сервису требуется объект конфигурации SSRS в конструкторе, и после отладки во время тестирования он равен нулю в блоке try / catch контроллера.

Если это проблема, я не уверен, как это исправить.Если нет, я не уверен, как поступить, чтобы исключение не создавалось.

@Slf4j
@RestController
@RequestMapping("/api/reports")
public class ReportsController {
    private final ReportsService reportsService;

    public ReportsController(@NonNull ReportsService reportsService) {
        this.reportsService = reportsService;
    }

    @PutMapping("/getReport")
    @Step
    public ApiResult getReport(@RequestBody ReportParamJSON params)
    {
        ApiResult result = new ApiResult();

        try {
            byte[] rptStream = reportsService.getReport(params.name, params.params, params.format);
            result.body = new String(Base64.getEncoder().encode(rptStream));
            result.success = true;
        }
        catch (Exception exc)
        {
            result.success = false;
            result.messages.add(exc.toString());
        }

        return result;
    }
}

@Slf4j
@Service
public class ReportsService {
private final SsrsConfig ssrsConfig;

    public ReportsService(@NonNull SsrsConfig ssrsConfig) {
        this.ssrsConfig = ssrsConfig;
    }

    @Step
    public byte[] getReport(String report, List<ReportParam> params, String format) throws Exception{
        // return some binary data.
    }
}

@RunWith(SpringRunner.class)
@WebMvcTest
@WithMockUser
public class ReportsControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private ReportsService reportsService;

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

    @Test
    public void givenGetReportUri_whenRequestReport_thenReturnReport() throws Exception {

        String response = "{\"body\":\"data\",\"success\":true,\"messages\":[]}";

        ArrayList<ReportParam> params = new ArrayList<>();
        params.add(new ReportParam("number", "1000"));
        params.add(new ReportParam("status", "1"));
        when(reportsService.getReport("test", params, "PDF")).thenReturn("data".getBytes());


        mockMvc.perform(put("/api/reports/getReport")
            .content("{\n" +
                    "  \"format\": \"PDF\",\n" +
                    "  \"name\": \"test\",\n" +
                    "  \"params\": [\n" +
                    "    {\n" +
                    "      \"name\": \"number\",\n" +
                    "      \"value\": \"1000\"\n" +
                    "    },\n" +
                    "    {\n" +
                    "      \"name\": \"status\",\n" +
                    "      \"value\": \"1\"\n" +
                    "    }\n" +
                    "  ]\n" +
                    "}")
            .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
            .andExpect(content().string(response));
    }
}

@ConfigurationProperties(prefix = "ssrs")
@Component
@Data
public class SsrsConfig {
    private String endpointUri;
}
...