Donatello:
Tengo Rest Controller con el método de crear ( validación utilizando util clase + databaseService (databaseDao + caching))
@RestController
@RequestMapping("files")
public class FilesController {
private IDbFilesDao dbFilesService;
private Map<String, Table> tables;
public FilesController(IDbFilesDao dbFilesService, Map<String, Table> tables) {
this.dbFilesService = dbFilesService;
this.tables = tables;
}
@PostMapping("{table}")
public ResponseEntity createTable(@PathVariable("table") String tableName,
@RequestBody File file) {
FilesValidator.validateAdding(tableName, tables, file);
dbFilesService.create(tableName, file);
URI location = ServletUriComponentsBuilder.fromCurrentRequest().buildAndExpand(file.getKey()).toUri();
return ResponseEntity.created(location).build();
}
}
Tengo un examen:
@RunWith(SpringRunner.class)
@WebMvcTest(value = FilesController.class, secure = false)
public class FilesControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private IDbFilesDao dbFilesService;
@MockBean
private Map<String, Table> tables;
@Test
public void create() throws Exception {
RequestBuilder requestBuilder = MockMvcRequestBuilders
.post("/files/tableName")
.accept(MediaType.APPLICATION_JSON)
.content(POST_JSON_BODY)
.contentType(MediaType.APPLICATION_JSON);
MvcResult result = mockMvc.perform(requestBuilder).andReturn();
MockHttpServletResponse response = result.getResponse();
assertEquals(HttpStatus.CREATED.value(), response.getStatus());
}
}
Funciona bien sólo que sin esta fila en @RestContoller:
FilesValidator.validateAdding(tableName, tables, file);
Con esta fila - 404 not found.
FilesValidator
- util clase con métodos estáticos. Comprueba si los datos son válidos y no hacer nada o una excepción de tiempo de ejecución con código de estado (404 por ejemplo).
¿Cómo puedo solucionarlo sin deliting de validación ?
Maciej Kowalski:
1) Mueva la llamada a un método de validación de nivel de paquete y hacer pequeña refactorización:
@PostMapping("{table}")
public ResponseEntity createTable(@PathVariable("table") String tableName,
@RequestBody File file) {
validateAdding(tableName, tables, file);
...
}
validateAdding(String tableName, Map<String, Table> tables, File file){
FilesValidator.validateAdding(tableName, tables, file);
}
2) espiar el controlador en la prueba:
@SpyBean
private FilesController filesControllerSpy;
3) Hacer validateAdding
método no hacer nada:
@Test
public void create() throws Exception {
doNothing().when(filesControllerSpy)
.validateAdding(any(String.class), any(Map.class), any(File.class));
...