如何为下面的类编写junit测试用例

时间:2016-08-12 08:32:56

标签: java unit-testing junit

我正和Mockito一起学习JUnit。我对如何开始以及如何为下面的类编写单元测试有所了解。如果有人帮我写这些文件会很高兴:

@Service
public class GetDataFromHistDataImpl implements GetDataFromHistData{    

  @Override
  public File downloadData(String formUrl) {
    String tk = null;
    String date= null;
    String datemonth= null;
    String platform= null;
    String timeframe= null;
    String fxpair= null;

    WebClient webClient=new WebClient();

    try 
    {
        HtmlPage page1=webClient.getPage(formUrl);
        webClient.getOptions().setJavaScriptEnabled(false); 
        HtmlForm form=page1.getFormByName("file_down");
        tk=form.getInputByName("tk").getAttribute("value");
        date=form.getInputByName("date").getAttribute("value");
        datemonth=form.getInputByName("datemonth").getAttribute("value");
        platform=form.getInputByName("platform").getAttribute("value");
        timeframe=form.getInputByName("timeframe").getAttribute("value");;
        fxpair=form.getInputByName("fxpair").getAttribute("value"); 
        System.out.println("fx"+fxpair);
        webClient.close();

    } 
    catch (IOException e1) {
        e1.printStackTrace();
    }

    Client client = ClientBuilder.newBuilder().build();

    WebTarget target = client.target("http://www.histdata.com/get.php");

    MultivaluedMap<String, String> map = new MultivaluedStringMap();
    map.add("tk", tk);
    map.add("date", date);
    map.add("datemonth", datemonth);
    map.add("platform", platform);
    map.add("timeframe", timeframe);
    map.add("fxpair", fxpair);

    InputStream responseStream = target.request().header("Referer", "http://www.histdata.com/")
            .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
            .header("Accept-Encoding", "tar, deflate")
            .post(Entity.form(map), InputStream.class);

        File file = new File("data.tar");

        OutputStream fos;
        try 
        {
            fos = new FileOutputStream(file);
            byte[] buffer = new byte[1024];
            int len;

            while ((len = responseStream.read(buffer)) != -1)
            {

                fos.write(buffer, 0, len);
            }
            fos.close();
        }       
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();    
        }

        return file;
}

@Override
public File unZipData(File zipFile) {
    byte[] buffer = new byte[1024];
    final String OUTPUT_FOLDER = "/Users/venkateswara/Downloads/Sindhu/histdata";
    File returnFileName=null;
     try{

        File folder = new File(OUTPUT_FOLDER);
        if(!folder.exists()){
            folder.mkdir();
        }

        ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
        ZipEntry ze = zis.getNextEntry();

        if(ze==null)
        {
            System.out.println("ZipFile is empty or corrupted");
            System.exit(0);
        }

        while(ze!=null){

           String fileName = ze.getName();
           File newFile = new File(OUTPUT_FOLDER + File.separator + fileName);
           if(FilenameUtils.getExtension(newFile.getName()).contains("csv"))
           {
               returnFileName=newFile.getAbsoluteFile();
           }

            //create all non exists folders
            //else you will hit FileNotFoundException for compressed folder
            new File(newFile.getParent()).mkdirs();

            FileOutputStream fos = new FileOutputStream(newFile);             

            int len;
            while ((len = zis.read(buffer)) > 0) {
            fos.write(buffer, 0, len);
            }

            fos.close();   
            ze = zis.getNextEntry();
        }   
        zis.closeEntry();
        zis.close();    
    }
     catch(IOException ex){
       ex.printStackTrace(); 
    }
  return returnFileName;    

}

private InsertHistDao insertHistDao;

@Autowired
public void setInsertHistIntoDb(InsertHistDao insertHistDao) {
    this.insertHistDao = insertHistDao;
}


@Override
public void getDataFromCsv(File unZipFile,String sym) {
    String[] csvLine=null;
    try 
    {
        CSVReader csvReader=new CSVReader(new FileReader(unZipFile));
        while((csvLine=csvReader.readNext())!=null)
        {
            System.out.println("data :"+Arrays.toString(csvLine));
            insertHistDao.insertHistIntoDb(csvLine,sym);
            rowsInserted++;
            System.out.println("Rows inserted:"+rowsInserted);
        }
        csvReader.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
   }
  }

这是我想要进行单元测试的类。

2 个答案:

答案 0 :(得分:1)

通常,您希望收听这些videos。认真;如果您想进行单元测试,那么您应该退后一步,了解真正意味着什么

在您的情况下,您的代码无法轻松测试。 启动:您的方法会使用 new 创建正在使用的webClient对象。这意味着:您的测试代码对该对象具有控制权。没有控制,测试是不可能的!

相反,您可能正在使用依赖注入。这意味着:您创建了一种方法,以便您的测试代码可以为您测试的代码提供模拟 webClient对象。然后你可以简单地描述:我希望这个调用发生在我的模拟上;然后,应返回该值。

但是,当然,这只是方法中的第一个对象。你的另一个问题是你在那个方法中做了很多太多的事情。相反,你必须分解成许多小东西。然后,您创建更多的类/对象,这些类/对象可以使用不同的功能。你自己测试它们。

所以,长话短说:

  1. 您真的必须退后一步,了解从单元测试中获利的代码......必须以非常不同的方式编写!
  2. 为了充分利用单元测试;您不仅需要了解&#34;单元测试实践&#34;和框架,但&#34;如何创建干净的代码&#34;和SOLID OO设计。

答案 1 :(得分:0)

首先,我建议您尝试编写JUnit测试以获得更简单的代码块。只需轻松返回值等。然后学习如何创建模拟以及为什么。 好的一点是,你可以编写干净易懂的代码。比你可以更轻松地编写JUnit测试。

我总是遵循规则&#34; AAA&#34; (安排,行动,断言)。安排 - 设置模拟,变量等。行动 - 在那里你可以教你的模拟他们应该做什么。断言 - 此块用于通过实际断言您的期望值。