简体   繁体   中英

Junit testing for exportcsv in spring boot

Hi I am new to spring and have created an Export csv application with two controllers which can give all the data as well as selective columns data and want to write junits for the same but it is quite difficult for me to do the same as I am not aware how i should do it some help would be really great Main class:

package com.example;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.example.model.Example;

import com.example.repository.ExampleRepository;

import net.bytebuddy.implementation.bind.annotation.Super;

@SpringBootApplication
public class ExampleApplication implements CommandLineRunner   {
    
    @Autowired 
    ExampleRepository exampleRepository;
    
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        

        
        
        List<Example> example= new ArrayList<>();

        // create dummy 
        example.add(new Example(1,"abc","sachin","abc","abc"));
        example.add(new Example(2,"abc","rahul","abc","abc"));
        example.add(new Example(3,"abc","rahul","abc","abc"));
        
        exampleRepository.saveAll(example);

    }
    
    
        
}

Entity layer:

package com.example.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="example")
public class Example{
    @Column(name="city")
    private String city;
    @Column(name="name")
    private String name;
    @Column(name="amount")
    private String amount;
    @Column(name="country")
    private String country;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private long id;
    //getter and setters
    }

Repository layer is as follows:

package com.example.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.example.model.Example;


@Repository("exampleRepository")
public interface ExampleRepository extends JpaRepository<Example,Long> {
    
    List<Report> findByName(String name);

}

service layer is as follows

package com.example.services;
import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import com.example.model.Example;
import com.example.repository.ExampleRepository;
@Transactional
@Service
public class ExampleService {
    @Autowired
    ExampleRepository exampleRepository;
    

    public List<Example> fetchAll() {
        return exampleRepository.findAll();
       

    }
    
    public List<Example> findByName(String name){
        return exampleRepository.findByName(name);
        
    }


    
}

I have 2 controllers one to get all details and one to get selective columns and here we are generating csv files based on records that match the name

COntroller 1:

package com.example.controllers;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.opencsv.CSVWriter;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.example.model.Example;
import com.example.services.ExampleService;

@RestController
@RequestMapping("/demo")
public class Controller1 {
    @Autowired
    ExampleService exampleService;
    @GetMapping("/result")
    public void exportCSV(@RequestParam(name="name") String name ,HttpServletResponse response) throws Exception {

        // set file name and content type
        String filename = "names.csv";
        response.setContentType("text/csv");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, 
                   "attachment; filename=\"" + filename + "\"");

        // Configure the CSV writer builder
        StatefulBeanToCsvBuilder<Example> builder = new StatefulBeanToCsvBuilder<Example>(response.getWriter()).withQuotechar(CSVWriter.NO_QUOTE_CHARACTER).withSeparator(CSVWriter.DEFAULT_SEPARATOR).withOrderedResults(false);

       
        // create a csv writer
        StatefulBeanToCsv<Example> writer = builder.build();

        // write all employees to csv file
        writer.write(examplesService.findByName(name));

    }  

}

Controller 2:

package com.reports.controllers;

import java.util.Arrays;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.opencsv.CSVWriter;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;
import com.example.model.Example;
import com.example.services.ExampleService;

@RestController
@RequestMapping("/example")
public class Controller2 {

    @Autowired
    ExampleService exampleService;

    @GetMapping("/output")
    public void exportCSV(@RequestParam(name="name") String name ,HttpServletResponse response) throws Exception {

        // set file name and content type
        String filename = "details.csv";
        response.setContentType("text/csv");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, 
                   "attachment; filename=\"" + filename + "\"");

        // Configure the CSV writer builder
        StatefulBeanToCsvBuilder<Example> builder = new StatefulBeanToCsvBuilder<Example>(response.getWriter()).withQuotechar(CSVWriter.NO_QUOTE_CHARACTER).withSeparator(CSVWriter.DEFAULT_SEPARATOR).withOrderedResults(false);

     // Ignore any field except the `id` and `amount` ones
        Arrays.stream(Example.class.getDeclaredFields())
                .filter(field -> !("id".equals(field.getName()) || "amount".equals(field.getName())
                        ))
                .forEach(field -> builder.withIgnoreField(Report.class, field));
      

        // create a csv writer
        StatefulBeanToCsv<Example> writer = builder.build();

        // write all employees to csv file
        writer.write(exampleService.findByname(name));

    }
}

Try this approach :

  • generate a file in your /src/test/resources path and then test if it contains the generated data you expected
  • use combine it with a file system mocking to do it

You will :

  • test your ResController
  • mock your Service class

Also use Contructor Injection for you dependency

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM