HtmlUnitを使ってファイルダウンロードのテストをする

SeleniumだとExcelやCSVなどのファイルをダウンロードさせるページのテストで、ダウンロードしたファイルの内容を検証することは難しいですが、HtmlUnitを使えばできます。

ファイルのダウンロードというのは、Content-Disposition:attachmentヘッダを返すようなレスポンスです。

HtmlUnitは、実ブラウザを使用するしないエミュレーション方式のWebテスト用のフレームワークです。

こんな感じのコードになります。

import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.attachment.Attachment;
import com.gargoylesoftware.htmlunit.attachment.CollectingAttachmentHandler;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class AttachmentTest extends TestCase{
	// ファイルをダウンロードするURL
	priavte static final String URL = "......";

	private WebClient client

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		client  = new WebClient();
	}

	public void testAttachment() throws Exception{
		WebClient client = new WebClient();

		List<Attachment> list = new ArrayList<Attachment>();
		client.setAttachmentHandler(new CollectingAttachmentHandler(list));

		// ダウンロードが発生するURLにアクセス
		Page page = client.getPage(URL);

		assertEquals(1, list.size());
		// ファイル名の検証
		assertEquals("foo.csv", list.get(0).getSuggestedFilename());
		// ファイル内容の検証
		assertEquals("....", list.get(0).getPage().getWebResponse().getContentAsString());
	}
}

ファイル内容の検証の部分は、Excelなどのバイナリファイルであれば、getContentAsStream()でPOIなどに読ませればよいと思います。内容の検証はサーバ側コードのテストだけで充分かもしれませんが。