单元测试验证特定s3存储桶的方法很简单,因为单元测试不会改变s3的状态。但是,单元测试写入s3存储桶的方法更成问题,因为它实际上每次运行单元测试时都会更改s3的状态。例如,使用rdd.saveAsTextFile(path)
。
是否可以为写入s3的方法编写单元测试,该方法仍允许您验证文件是否已写入?
注意:我考虑使用模拟对象,但不确定如何实现。
编辑:我应该注意到我正在使用Scala
答案 0 :(得分:0)
通常在编写单元测试时,建议您注意“模拟”或“存根”对外部API的任何调用。这允许您仅测试给定的工作单元,在这种情况下,您的代码将写入s3。
在你的情况下,你会模拟类似于用于与s3通信的aws sdk对象,并指定调用的预期回报。
答案 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)