Я пытаюсь смоделировать службу 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;
}