0

JUnit テストを作成する必要があるメソッドがあります。

public class MyClass {
  private String file1;
  private String file2;

  public void myMethodSpaceCheck(){
    if (new File(file1).size() > new File(file2).size() {
       throw new Exception .....  
    } 
  }
}

Mockito を使用してその JUnit テストを作成することは可能ですか?

4

1 に答える 1

2

Java でファイルを処理する場合、私が好むオプションは Apache VFS を使用することです。これにより、ファイルを他の POJO として扱うことができます。明らかに、すでにファイル API に行き詰まっている場合、それは大変な作業です。

別のオプションは、Mockito を完全に忘れて、それらのファイルをシステムに書き込むことです。一部のシステムでテストを並行して実行することが難しくなる場合があるため、通常はそれを避けます。

この特定の状況に対する私の解決策は、通常、新しいファイルをインスタンス化できる FileBuilder などの特別なクラスを提供することです。

public class FileBuilder {
  public java.io.File newFile(String pathname) {
    return new java.io.File(pathname);
  }
}

次に、このクラスを MyClass に渡す前にモックし、必要に応じてインストルメント化します。

@Test(expected = Exception.class)
public void should_fail_when_file1_is_bigger_than_file2() {
  FileBuilder mockFile1 = file(2L);
  FileBuilder mockFile2 = file(1L);
  FileBuilder mockFileBuilder = mock(FileBuilder.class);
  when(mockFileBuilder.newFile("file1").thenReturn(mockFile1);
  when(mockFileBuilder.newFile("file2").thenReturn(mockFile2);

  new MyClass(mockFileBuilder).myMethodSpaceCheck();
}

private static File file(long length) {
    File mockFile = mock(File.class);
    when(mockFile.length()).thenReturn(length);
    return mockFile;
}

(あなたの例は File.size() に言及しています;私はあなたが File.length() を意味すると仮定しました)

MyClass の実際の実装は次のようになります。

public class MyClass {
  private String file1;
  private String file2;
  private final FileBuilder fileBuilder;

  public MyClass() {
    this(new FileBuilder());
  }

  @VisibleForTesting
  MyClass(FileBuilder fileBuilder) {
    this.fileBuilder = fileBuilder;
  }

  public void myMethodSpaceCheck() //...
}
于 2012-11-13T10:35:38.563 に答える