Skip to main content

File upload using Spring boot rest service with unit testing

We will create a REST service using spring boot which will have an endpoint to upload the file. Then we create JUnit test for upload service using mocking.

Maven dependency

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

REST Service for file upload

Below service reads the content of uploaded file and print on the console. Client application will upload the file using given endpoint "loadFile".
    @PostMapping(path="/loadFile")
    public void loadWordsFromFile(MultipartFile file) throws IOException {
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))){
        Set<String> dictList = new HashSet<>();
        reader.lines()
            .filter(ln->ln!=null && !ln.trim().equals(""))
            .map(ln->ln.split("[\\s*]"))
            .forEach(arr->{
                Arrays.stream(arr)
                .map(str->str.replaceAll("[.!]", ""))
                .filter(str->str.length()>0)
                .forEach(str->{
                    System.out.println(str);
                });
            });
        }
    }

JUnit Test

Below is the complete code for unit testing where we are creating a mock file with given text and then uploading it to our mocked service.
@RunWith(SpringRunner.class)
@SpringBootTest
public class WordDictionaryApplicationTests {
    private MockMvc mockMvc;
    @Autowired
    WebApplicationContext wContext;

    @Before
    public void setup() {
       this.mockMvc = MockMvcBuilders.webAppContextSetup(wContext)
           .alwaysDo(MockMvcResultHandlers.print())
           .build();
    }

    @Test
    public void firstUploadWordsTest() throws Exception {
        String text ="Text to be uploaded.";
        MockMultipartFile file = new MockMultipartFile("file","test.txt", "text/plain", text.getBytes());
        mockMvc.perform(MockMvcRequestBuilders.multipart("/loadFile/")
               .file(file)
               .characterEncoding("UTF-8"))
               .andExpect(MockMvcResultMatchers.status().isOk());
    }
}

Test output:

After executing the test you will see similar output where it has printed the submitted text from uploaded file.
2019-11-17 16:02:36.122  INFO 10269 --- [           main] com.wd.WordDictionaryApplicationTests    : Started WordDictionaryApplicationTests in 7.13 seconds (JVM running for 8.675)
2019-11-17 16:02:36.281  INFO 10269 --- [           main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet ''
2019-11-17 16:02:36.281  INFO 10269 --- [           main] o.s.t.web.servlet.TestDispatcherServlet  : Initializing Servlet ''
2019-11-17 16:02:36.323  INFO 10269 --- [           main] o.s.t.web.servlet.TestDispatcherServlet  : Completed initialization in 41 ms
Text
to
be
uploaded

Comments

Post a Comment