[英]How to unit Test Lambda functions in Mockito?
我有一個 lambda 處理程序,它會在每個 S3Event 的任何時候觸發。
s3Event.getRecords().forEach(record->{
final String bucket = record.getS3().getBucket().getName();
final String object = record.getS3().getObject().getKey();
S3Object s3Object = amazonS3.getObject(bucket, object);
... More parsing logic
因此,為了測試此功能,我創建了 Mock S3Event 構建器,它將為我構建一個模擬 S3Event。 還
S3Event s3Event = buildS3Event(S3_BUCKET_NAME, S3_FILE_NAME);
List<S3EventNotification.S3EventNotificationRecord> mockRecords = s3Event.getRecords();
S3EventNotification.S3EventNotificationRecord mockFirstRecord = s3Event.getRecords().get(0);
S3EventNotification.S3Entity mockS3Entity = mockFirstRecord.getS3();
S3EventNotification.S3BucketEntity mockS3BucketEntity = mockS3Entity.getBucket();
S3EventNotification.S3ObjectEntity mockS3ObjectEntity = mockS3Entity.getObject();
String bucketName = mockS3BucketEntity.getName();
String keyName = mockS3ObjectEntity.getKey();
BuildS3Event、getMockS3Bocket 是我用來創建相應模擬的實用函數。
類模擬也是:
s3Client = Mockito.mock(AmazonS3.class);
s3Object = Mockito.mock(S3Object.class);
s3EventMock = Mockito.mock(S3Event.class);
notificationRecord = Mockito.mock(S3EventNotification.S3EventNotificationRecord.class);
notificationRecords = Mockito.mock(List.class);
s3Entity = Mockito.mock(S3EventNotification.S3Entity.class);
s3BucketEntity = Mockito.mock(S3EventNotification.S3BucketEntity.class);
s3ObjectEntity = Mockito.mock(S3EventNotification.S3ObjectEntity.class);
when(s3EventMock.getRecords()).thenReturn(mockRecords);
handler.handle(s3Event, null) <--- calling the handler
verify(s3EventMock, times(1)).getRecords(); // seems to work
verify(notificationRecords, times(1)).get(0); // fails with wanted but not invoked error.
我在嘲笑時錯過了什么嗎?
我會將 lambda 的內容移動到一個單獨的方法中,該方法可以直接進行測試:
public void someMethod() {
s3Event.getRecords().forEach(this::parse);
}
void parse(...) {
...
}
這也將提高可讀性,因為超過一行的 lambda 表達式比具有不言自明的名稱的方法引用更難閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.