ダウンロードしたcsvファイルの中身が想定通りかどうか確かめるテスト
wicketでつくったページからダウンロードしたcsvファイルの中身が想定通りかどうか確かめるテスト!!!
mainのパッケージに置いたshokos.csvをダウンロードして、testのパッケージに置いたまったく同じ内容のexpected.csvと比較するテストを書きます。
ファイルの中身は1行目がヘッダーで、あとにデータが続く構成です。
名前,年齢,職業 shokos,20,フラワーアレンジメント hoge,22,学生
ページのclass
package jp.ne.hatena.syoko_sasaki; import java.io.IOException; import java.io.OutputStream; import org.apache.wicket.PageParameters; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget; import org.apache.wicket.util.io.IOUtils; import org.apache.wicket.util.resource.AbstractResourceStreamWriter; public class DownloadPage extends WebPage { public DownloadPage(PageParameters parameters) { Link<Void> downloadLink = new Link<Void>("download") { private static final long serialVersionUID = 1L; @Override public void onClick() { this.getRequestCycle().setRequestTarget( new ResourceStreamRequestTarget( new AbstractResourceStreamWriter() { private static final long serialVersionUID = 1L; public String getContentType() { return "application/octet-stream;charset=MS932"; } public void write(OutputStream output) { try { IOUtils.copy( DownloadPage.class .getResourceAsStream("shokos.csv"), output); } catch (IOException e) { e.printStackTrace(); } } }, "shokos.csv")); } }; add(downloadLink); } }
対応するhtmlファイル
<html> <head> <title>ダウンロード画面</title> </head> <body> <strong>ダウンロード</strong> <br/><br/> <button wicket:id="download">CSV出力</button> </body> </html>
テストコード
package jp.ne.hatena.syoko_sasaki; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.protocol.http.MockHttpServletResponse; import org.apache.wicket.util.io.IOUtils; import org.apache.wicket.util.tester.WicketTester; import org.junit.Before; import org.junit.Test; public class DownloadPageTest { WicketTester tester = new WicketTester(); @Before public void before() { tester.startPage(DownloadPage.class); } @Test public void ページ表示() throws Exception { tester.assertRenderedPage(DownloadPage.class); tester.assertComponent("download", Link.class); } @Test public void ダウンロードできること() throws Exception { tester.clickLink("download"); String dir = System.getProperty("java.io.tmpdir"); MockHttpServletResponse response = tester.getServletResponse(); assertThat(response.getContentType(), is("application/octet-stream;charset=MS932")); File file = new File(dir + File.separator + "shokos.csv"); FileOutputStream responceOutputStream = new FileOutputStream(file); responceOutputStream.write(response.getBinaryContent()); responceOutputStream.close(); assertCsvFile(dir + File.separator + "shokos.csv", "expected.csv"); } private void assertCsvFile(String actualFile, String expectedFile) { String actual = null; String expected = null; try { actual = IOUtils.toString(new InputStreamReader( new FileInputStream(actualFile), "MS932")); expected = IOUtils.toString( getClass().getResourceAsStream(expectedFile), "MS932"); } catch (IOException e) { e.printStackTrace(); } List<Map<String, String>> actualList = parse(actual); List<Map<String, String>> expectedList = parse(expected); assertThat(actualList.size(), is(expectedList.size())); for (int i = 0; i < actualList.size(); i++) { Map<String, String> acutualMap = actualList.get(i); Map<String, String> expectedMap = expectedList.get(i); assertThat(acutualMap.size(), is(expectedMap.size())); for (String key : expectedMap.keySet()) { assertThat(acutualMap.get(key), is(expectedMap.get(key))); } } } List<Map<String, String>> parse(String csv) { String cammma = ","; List<String> lines = Arrays.asList(csv.split("\r")); String headLine = lines.get(0); String[] header = headLine.split(cammma); lines = lines.subList(1, lines.size()); List<Map<String, String>> list = new ArrayList<Map<String, String>>(); for (String line : lines) { Map<String, String> map = new HashMap<String, String>(); String[] split = line.split(cammma); for (int i = 0; i < split.length; i++) { map.put(header[i], split[i]); } list.add(map); } return list; } }
parseメソッドで、
ファイル1行目(ヘッダー)をカンマで区切ってkeyとし、配列で持つ。
2行目以降をカンマで区切って、keyと一緒にMapにputしていく。
1行分のMapができたらListにaddする。
この処理をダウンロードしたファイルと想定ファイル2つ分して、各リストの要素を比較!