我正和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();
}
}
}
这是我想要进行单元测试的类。
答案 0 :(得分:1)
通常,您希望收听这些videos。认真;如果您想进行单元测试,那么您应该退后一步,了解真正意味着什么。
在您的情况下,您的代码无法轻松测试。 启动:您的方法会使用 new 创建正在使用的webClient对象。这意味着:您的测试代码对该对象具有无控制权。没有控制,测试是不可能的!
相反,您可能正在使用依赖注入。这意味着:您创建了一种方法,以便您的测试代码可以为您测试的代码提供模拟 webClient对象。然后你可以简单地描述:我希望这个调用发生在我的模拟上;然后,应返回该值。
但是,当然,这只是方法中的第一个对象。你的另一个问题是你在那个方法中做了很多太多的事情。相反,你必须分解成许多小东西。然后,您创建更多的类/对象,这些类/对象可以使用不同的功能。你自己测试它们。
所以,长话短说:
答案 1 :(得分:0)
首先,我建议您尝试编写JUnit测试以获得更简单的代码块。只需轻松返回值等。然后学习如何创建模拟以及为什么。 好的一点是,你可以编写干净易懂的代码。比你可以更轻松地编写JUnit测试。
我总是遵循规则&#34; AAA&#34; (安排,行动,断言)。安排 - 设置模拟,变量等。行动 - 在那里你可以教你的模拟他们应该做什么。断言 - 此块用于通过实际断言您的期望值。