簡體   English   中英

單元測試失敗:mockS3FileRead NullPointerException

[英]Unit test failed: mockS3FileRead NullPointerException

我的單元測試因此錯誤而失敗。

 Error: java.lang.NullPointerException com.amazon.heimdalltttingestionservicelambda.s3.S3FileTransmissionTest.mockS3FileRead(S3FileTransmissionTest.java:66) com.amazon.heimdalltttingestionservicelambda.s3.S3FileTransmissionTest.testSuccess(S3FileTransmissionTest.java:39) at org.mockito.junit.MockitoJUnitRunner.run(Unknown Source)
public class S3FileTransmission {

    AmazonS3Encryption s3EncryptionReceiveClient;

    public void downloadDecryptWithS3Encryption(@NonNull final String fileKey, @NonNull final String bucketName,
                                                @NonNull final File file)
    {
        try {
            final InputStream downloadFileStream = this.s3EncryptionReceiveClient.getObject(bucketName,
                    fileKey).getObjectContent();

            FileUtils.copyInputStreamToFile(downloadFileStream, file);
            Environment.log("downloadDecryptWithS3Encryption:Completed file write to filepath: {} ", file.getPath());

        }  catch (final Exception e) {
            Environment.log("[%s]: Error in downloading and decrypting filekey:[%s]",
                    LogMetricKeys.S3_FILE_DECRYPTION_FAILURE_, fileKey);

        }
    }
}

單元測試代碼:

@RunWith(MockitoJUnitRunner.class)
public class S3FileTransmissionTest extends BaseTester {

    AmazonS3Encryption s3EncryptionReceiveClient;
    @Mock
    S3FileTransmission s3FileTransmission;

    @Before
    public void setup() {
        super.setup();
        s3EncryptionReceiveClient = Mockito.mock(AmazonS3Encryption.class);
    }

    @Test
    public void testSuccess(){
        File file = new File("/test/text.csv");
        mockS3FileRead(prepareFileContent());
        s3FileTransmission.downloadDecryptWithS3Encryption(BUCKET, KEY, file);
    }

    private String prepareFileContent() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(EmployeeLenelBadgeDataField.EXPECTED_HEADERS_STRING);
        stringBuilder.append("\n");

        for (int employeeIndex = 1; employeeIndex < 5; employeeIndex++) {
            stringBuilder.append(MockDataRecords.getEmployeeLenelBadgeDataRecord());
            stringBuilder.append("\n");
        }
        return stringBuilder.toString();
    }

    private void mockS3FileRead(String fileContent) {
        // Inject test data
        Answer<ObjectMetadata> answer = invocationOnMock -> {
            File file = invocationOnMock.getArgument(1);
            FileWriter fileWriter = new FileWriter(file);
            fileWriter.write(fileContent);
            fileWriter.flush();
            fileWriter.close();

            return null;
        };
        Mockito.when(s3EncryptionReceiveClient.getObject(anyString(), anyString()).getObjectContent()).thenAnswer(answer);
    }
}

您嘲笑s3EncryptionReceiveClient.getObject()的方式是錯誤的。 正確的做法是:

@Before
public void setup() {
    super.setup();
    s3EncryptionReceiveClient = Mockito.mock(AmazonS3Encryption.class);
    SomeClassThatGetObjectReturns obj = Mockito.mock(SomeClassThatGetObjectReturns.class);
}

private void mockS3FileRead(String fileContent) {
    ...
    ...
    Mockito.when(s3EncryptionReceiveClient.getObject(anyString(), anyString()).thenReturn(obj)
    Mockito.when(obj.getObjectContent()).thenReturn(anInputStreamMockedObject);
}

這個想法是使用實際返回類型的正確模擬/虛擬來模擬每個外部方法調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM