2017-08-08 2 views
1

Ich habe einen Rest-Service ähnlich this one implementiert.Wie wird der Dateiupload im Spring Boot getestet?

UserController.java

@RestController 
@RequestMapping(path = "/user") 
public class UserController { 

    private final UserService userService; 

    @Autowired 
    public UserController(UserService userService) { 
    this.userService = userService; 
    } 

    @PostMapping(path = "/{id}/avatar") 
    public void handleUpload(@PathVariable("id") int id, @RequestParam("file") MultipartFile file) { 
    if (file == null) { 
     throw new DashboardException("Please select a valid picture"); 
    } 
    userService.setAvatar(id, file); 
    } 

} 

Jetzt versuche ich, mit dem Rest-Endpunkt zu testen:

UserControllerEndpointTest.java

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = Application.class) 
@WebAppConfiguration 
public class UserControllerEndpointTest { 

    private static final int userId = 42; 
    private static final String urlPath = String.format("/user/%d/avatar", userId); 

    private MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext webApplicationContext; 
    @Autowired 
    private UserController controller; 
    private UserService service; 

    @Before 
    public void setUp() throws NoSuchFieldException, IllegalAccessException { 
    mockMvc = webAppContextSetup(webApplicationContext).build(); 
    service = Mockito.mock(UserService.class); 
    injectField(controller, "userService", service); 
    } 

    @Test 
    public void successfullySetAvatar() throws Exception { 
    final InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.png"); 
    final MockMultipartFile avatar = new MockMultipartFile("test.png", "test.png", "image/png", inputStream); 

    doNothing().when(service).setAvatar(userId, avatar); 

    final MvcResult result = mockMvc.perform(fileUpload(urlPath).file(avatar)) 
      .andExpect(status().isOk()) 
      .andReturn(); 

    verify(service).setAvatar(userId, avatar); 
    } 
} 

Dieser schlägt mit 400 - Required request part 'file' is not present.

Was fehlt mir?

+0

Können Sie weitere Informationen darüber, wie Sie Ihren Test einrichten? – Plog

+0

@Plog, habe ich das Testsetup hinzugefügt. Danke für die Erinnerung. –

Antwort

3

Wahrscheinlich müssen Sie
new MockMultipartFile("test.png", "test.png", "image/png", inputStream);
zu
new MockMultipartFile("file", "test.png", "image/png", inputStream); als hochgeladene Datei Parameternamen ändern ‚Datei‘

+0

Ja, das sollte es lösen, ich war gerade dabei, das gleiche zu posten. – Plog

+0

Danke, das hat das Problem wirklich gelöst. –

Verwandte Themen