2017-03-22 35 views
1

ファイルを処理するコードをカバーしようとしています。私はテストのために実際のファイルを使用しないようにしようとしているので、私はMockitoを使用しています。Junit - ファイルを模倣する

try { 
    byte[] data = Files.readAllBytes(((File) body).toPath()); 
    immutableBody = data; 
    actualHeaderParams.put(HttpHeaders.CONTENT_LENGTH, (new Integer(data.length)).toString()); 
    contentType = MediaType.APPLICATION_OCTET_STREAM; 
    } 

私はモックファイルを使用しています: これは私がテストしようとしているコードである

File mockedFile = Mockito.mock(File.class); 

が、私は「toPath」に関する例外を取得します。そこでいくつかのパスまたはnullを追加しましたが、ファイルがパスに存在しないため、再び例外が発生します。

when(mockedFile.toPath()).thenReturn(Paths.get("test.txt")); 

取得:

com.http.ApiException: There was a problem reading the file: test.txt 

は、テストのために実際のファイルを作成せずにそれを行う方法はありますか?

+0

コンテンツを渡す方法を見つけ、それをファイルから読み取るという事実を外部化します。メソッドのシグネチャを変更して、バイトのソースを移動します。 – duffymo

+0

通常、 '@Rule Public TemporaryFolder folder = new TemporaryFolder()'を使い、必要な "偽の"ファイルコンテンツを作成する方が簡単です。ファイルを欺くことは本当に痛いほどのことになります。 – cjstehno

答えて

0

簡単な方法があるかどうかはわかりませんが、間違っている可能性があります。おそらくPowerMockのようなものを使用する必要がある静的Files.readAllBytes()メソッドをモックする必要があります。

public byte[] getAllBytesWrapper(File body) { 
    return Files.readAllBytes(body.toPath()); 
} 

してから、このメソッドのモックがあります:またはあなたが、その後の動作を模擬することができる方法でこれをラップすることができますが、ファイルの読み込みをモックとしたいので

when(classUnderTest.getAllBytesWrapper(any(File.class))).thenReturn("test".getBytes()); 
5

を私は仮定しますあなたはそのため私が提案する、(実際のファイルを使用せずに)あなたが単独でテストしたいと思い、このクラスでは、いくつかのロジックを持っている:

移動別のクラスにファイルを読み込むの責任なので、代わりになるの:

ビジネスロジックとインターリーブ
byte[] data = Files.readAllBytes(((File) body).toPath()); 

、している:あなたは、あなたのテストで、その後

class FileToBytesReader { 
    byte[] read(File file) throws IOException { 
    return Files.readAllBytes(((File) body).toPath()); 
    } 
} 

byte[] data = fileReader.read(body); 

fileReaderは、これらの線に沿って非常に単純な実装を使用して、クラスのインスタンスになりますfileReaderを期待値を設定できるモックで補うことができます。

あなたがFileToBytesReaderクラスを作成する必要はありませんが、あなたはjava.util.Functionを使用できるJava 8を使用している場合:

Function<File, byte[]> fileReader = (file) -> { 
    try { 
    return Files.readAllBytes(((File) file).toPath()); 
    } catch (IOException e) { 
    throw new UncheckedIOException(e); 
    } 
}; 

ところで。レガシーコードで作業しており、実動コードを変更できない場合は、PowerMockを使用してこの静的メソッドをモックする必要があります。

0

Mock Files.readAllBytes()をMatchers.any()を引数として使用します。バイト配列を返します。

関連する問題