0

JUnit テスト用に File および FileInputStream オブジェクトをモックしたいと思います。

パーサーがあるとしましょう。パーサーの外部からは、parse(File myFile) メソッドを介してアクセスできます。readMyStream.... などの他のメソッドは非公開です。

コード例:

public class Parser {

   public HashMap<String, String> parse(File myFile) throws Exception {
         HashMap<String, String> myConfig;
         Config config;

         try {
             //this line gives me a headache
             FileInputStream myFileInputStream = new FileInputStream(myFile);

             configStream = readMyStream(myFileInputStream);
               ..........
         } catch (FileNotFoundException e) {
                throw e;
         }
         return myConfig;
   }
   //reads the stream 
   private Config readMyStream(FileInputStream myFileInputStream) {
      Config config;    

      ...JDOM stuff....    

      return config;
   }
}

私が直面している問題:

  • ファイル オブジェクトを FileInputStream (PowerMockito) としてアサートする方法 このファイルは、次の内容でこの FileInputStream に属します
  • プライベート メソッドをモックする方法 (Mockito/PowerMockito)

モッキング/動作しない例:)...

public class ParserTest {

   @Test
   public final void testParse() {
      File MOCKEDFILE = PowerMockito.mock(File.class);
      PowerMockito.when(MOCKEDFILE.exists()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.isFile()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.isDirectory()).thenReturn(false);
      PowerMockito.when(MOCKEDFILE.createNewFile()).thenReturn(true);
      PowerMockito.when(MOCKEDFILE.length()).thenReturn(11111111L);

      //what about the path of MOCKEDFILE which isn't existing
      PowerMockito.when(MOCKEDFILE.getPath()).thenReturn(?????);

      //how to assign a File an FileInputStream? (I thought something like)
      PowerMockito.mockStatic(FileInputStream.class);
      FileInputStream MOCKEDINPUTSTREAM = PowerMockito.mock(FileInputStream.class);
      PowerMockito.whenNew(FileInputStream.class).withArguments(File.class).thenReturn(MOCKEDINPUTSTREAM);

      //how to mock the private method readMyStream
   }
4

1 に答える 1

4

モックするのではなく、ルールを使用して、必要に応じてファイルを作成する/作成しないことをおFile勧めします。TemporaryFolder

以前のプロジェクトでは、FileInputStreamSupplierを作成するために使用されるクラスを作成しましたFileInputStreamFileInputStream次に、このクラスをモックして、動作のテストを可能にするモックを提供できます。一般に、クラスにSupplier<FileInputStream>(Guava を使用して) を取り、それをモックすることができます。

于 2012-10-17T15:33:13.940 に答える