Spock Mock() オブジェクトに問題があります。テストしようとしているJavaクラスがあります。このクラスは、モックしたいいくつかの ftp 処理を行います。私のサンプルコード
class ReceiveDataTest extends Specification{
String downloadPath = 'downloadPath';
String downloadRegex = 'downloadRegex';
SftpUtils sftpUtils = Mock();
ReceiveData receiveData;
def setup(){
sftpUtils.getFileNames(downloadPath,downloadRegex) >> ['file1', 'file2']
receiveData= new ReceiveData()
receiveData.setDownloadPath(downloadPath)
receiveData.setDownloadRegex(downloadRegex)
receiveData.setSftpUtils(sftpUtils);
}
def "test execute"() {
given:
def files = sftpUtils.getFileNames(downloadPath,downloadRegex)
files.each{println it}
when:
receiveData.execute();
then:
1*sftpUtils.getFileNames(downloadPath,downloadRegex)
}
}
public class ReceiveData(){
//fields, setters etc
public void execute() {
List<String> fileNames = sftpUtils.getFileNames(downloadPath, downloadRegex);
for (String name : fileNames) {
//dowload and process logic
}
}
}
ここで、"test execute" 内で files.each{} が期待される内容を出力します。しかし、 receiveData.execute() が呼び出されると、私の sftpUtils は null を返します..理由はありますか?
編集 多分私は自分の問題をうまく述べていませんでした-getFileNamesが呼び出されたかどうかを確認したくないだけです。forループを適切にチェックするには、結果が必要です。実行内のループにコメントを付けると、テストに合格します。しかし、getFilenames() メソッドの結果を使用するため、NPE 実行メソッドが for ループに到達します。mockitoを使用すると、このようなことをします
Mockito.when(sftpUtils.getFilenames(downloadPath, downloadRegex)).thenReturn(filenamesList);
receiveData.execute();
Mockito.verify(sftpUtils).getFilenames(downloadPath, downloadRegex);
//this is what I want to test and resides inside for loop
Mockito.verify(sftpUtils).download(downloadPath, filenamesList.get(0));
Mockito.verify(sftpUtils).delete(downloadPath, filenamesList.get(0));
しかし、Spock 内で Mockito.verify() を使用してブロックすることはできません