Tengo un método que recibe como parámetro un objeto MultipartFile. Dentro del método que utilizo ImageIO.read(some_value)
y ImageIO.write(some_value)
. Quiero probar este método con una imagen imaginaria (no quiero tener las imágenes almacenadas en la carpeta de recursos).
He intentado esto: MockMultipartFile file = new MockMultipartFile("file", "boat.jpg", "image/jpeg", "content image".getBytes());
pero sin éxito.
public void f(MultipartFile file) throws IOException {
final BufferedImage read = ImageIO.read(new ByteArrayInputStream(file.getBytes()));
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
ImageIO.write(read, "jpg", baos);
}
}
Cuando ejecuto la prueba de la read
variable tiene null
valor. Creo que el problema viene de "content image".getBytes()
.
¿Hay alguna posibilidad de utilizar imágenes simuladas en vez de los de verdad?
"content image".getBytes()
devuelve una byte[]
representación de la cadena "content image"
. ¿Cómo se ImageIO
supone que la construcción de una BufferedImage
de eso?
Usted tiene dos opciones aquí.
- Pasar una
byte[]
de los datos reales deMockMultipartFile
- Ya que ha mencionado usted no desea utilizar recursos de imágenes simuladas, esto no parece ser un buen ajuste.
- Mock
ImageIO
métodos estáticos 's utilizando Powermock- El método burlado volverá un verdadero
BufferedImage
su método se puede utilizar, sin tener que leer una imagen desde un archivo. - Esto le da la ventaja añadida de ser capaz de burlarse de la llamada a
write()
así, si lo desea. - Código de muestra:
- El método burlado volverá un verdadero
PowerMockito.mockStatic(ImageIO.class);
when(ImageIO.read(any())).thenAnswer(invocation -> {
Object argument = invocation.getArguments()[0];
// here you can check what arguments you were passed
BufferedImage result = new BufferedImage(600, 400, BufferedImage.TYPE_INT_RGB); // create a BufferedImage object
// here you can fill in some data so the image isn't blank
return result;
});
Ahora, cuando su método en llamadas de prueba imageIO.read()
, que recibirá el BufferedImage
que la construcción de la lambda, sin llegar a la lectura de los archivos.