文字列ファイル名を受け取り、ファイルを開いてそこから読み取るメソッドの単体テストを作成しようとしています。そこで、そのメソッドをテストするために、ファイルを作成してからメソッドを呼び出すことを考えました。ただし、ビルド ファームでは、任意にファイルをディスクに書き込むことはできません。単体テストで実際のファイルを「シミュレート」する標準的な方法はありますか?
22316 次
4 に答える
19
これには、MockitoとPowermockの組み合わせが適していることがわかりました。実際には、サンプルを含むブログ投稿があり、ファイル クラスのコンストラクターがテスト目的でモックされています。ここに私が一緒に投げた小さな例もあります:
public class ClassToTest
{
public void openFile(String fileName)
{
File f = new File(fileName);
if(!f.exists())
{
throw new RuntimeException("File not found!");
}
}
}
Mockito + Powermock でのテスト:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToTest.class)
public class FileTest
{
@Test
public void testFile() throws Exception
{
//Set up a mocked File-object
File mockedFile = Mockito.mock(File.class);
Mockito.when(mockedFile.exists()).thenReturn(true);
//Trap constructor calls to return the mocked File-object
PowerMockito.whenNew(File.class).withParameterTypes(String.class).withArguments(Matchers.anyString()).thenReturn(mockedFile);
//Do the test
ClassToTest classToTest = new ClassToTest();
classToTest.openFile("testfile.txt");
//Verify that the File was created and the exists-method of the mock was called
PowerMockito.verifyNew(File.class).withArguments("testfile.txt");
Mockito.verify(mockedFile).exists();
}
}
于 2012-08-07T16:30:09.717 に答える
0
実際のクラス(BufferredReader、Fileなど)を完全に(すべてのメソッドまたは使用するすべてのメソッドを意味する)オーバーライドするモックストリームクラスを使用するのはどうですか?異なるテストクラス間で使用する場合、データはバイトの配列として、たとえばシングルトンで保存できます。
于 2012-08-07T16:18:30.303 に答える
-2
これは非常に嫌われています:
テスト可能なコードの最小量。多くの場合、単一のメソッド/関数は、他のメソッドやクラスを使用できません。速い!何千もの単体テストを 10 秒以内に実行できます。ユニットテストは決して使用しません:
- データベース
- アプリサーバー (または任意の種類のサーバー)
- ファイル/ネットワーク I/O またはファイル システム。
- 別のアプリケーション;
- コンソール (System.out、System.err など)
- ロギング
- 他のほとんどのクラス (例外には、DTO、文字列、整数、モック、およびその他のいくつかが含まれます)。"
ファイルから読み取る必要がある場合は、すべての単体テストが読み取るテスト ファイルを事前に生成します。ディスクに何も書き込む必要はありません。
于 2012-08-07T16:05:52.970 に答える