你可以单元测试s3写吗?

时间:2018-02-01 22:16:16

标签: scala unit-testing testing amazon-s3 junit

单元测试验证特定s3存储桶的方法很简单,因为单元测试不会改变s3的状态。但是,单元测试写入s3存储桶的方法更成问题,因为它实际上每次运行单元测试时都会更改s3的状态。例如,使用rdd.saveAsTextFile(path)

的方法

是否可以为写入s3的方法编写单元测试,该方法仍允许您验证文件是否已写入?

注意:我考虑使用模拟对象,但不确定如何实现。

编辑:我应该注意到我正在使用Scala

3 个答案:

答案 0 :(得分:0)

通常在编写单元测试时,建议您注意“模拟”或“存根”对外部API的任何调用。这允许您仅测试给定的工作单元,在这种情况下,您的代码将写入s3。

在你的情况下,你会模拟类似于用于与s3通信的aws sdk对象,并指定调用的预期回报。

http://www.baeldung.com/mockito-annotations

答案 1 :(得分:0)

这不是严格意义上的单元测试,但我还是运气好,如下所示

describe ('s3', () => {
  const contents = uuid.v4()
  const key = uuid.v4()

  it('should write to s3', () => {
    const result = write(key, contents)
    assertSuccess(result)
  }

  it('should read from s3', () => {
    const result = read(key)
    assertSuccess(read, contents)
  }

  it('should clear from s3', () => {
    const result = clear(key)
    assertSuccess(result)
  }

  it('should no longer have the value', () => {
    const result = read(key)
    assertFailure(result) // or maybe assertSuccess(result, empty), depending on your requirements
  }

})

根据我的经验,这可以满足单元测试(快速,可靠)的宽松要求,而不会100%满足测试独立性和解耦的硬性要求。

答案 2 :(得分:0)

您可能需要查看mockito

你要做的是创建你的s3客户端的模拟(使用mock),存根put方法(使用when.thenReturn),然后验证s3 put使用正确的数据库和密钥完成(使用verify)。

val s3 = org.scalatest.mock.MockitoSugar.mock[AmazonS3]
when(s3.putObject(any[String], any[String], any[String]).thenReturn(new PutObjectResult)

-- execute the code under test here --

verify(s3).putObject(theExpectedBucket, theExpectedKey, theExpectedData)