在Groovy测试中如何在InputStream方法上抛出IOException?

k5hmc34c  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(163)

代码(Java 11):

final InputStream pdfDocument = myService.generate(manifest);
final byte[] pdfDocumentBytes;
try {
  pdfDocumentBytes = pdfDocument.readAllBytes();
} catch (IOException e) {
  log.error("Unable to read content", e);
  throw new MyServiceException(MyServiceExceptionKey, MessageSeverity.ERROR, HttpStatus.BAD_REQUEST);
}

测试(Groovy 3.0.9):

def exception = {throw new IOException()}
def pdfDocument = Spy(InputStream.class)
pdfDocument.readAllBytes() >> exception

替代测试:

InputStream pdfDocument = Mock(InputStream.class)
PowerMockito.when(pdfDocument.readAllBytes()).thenThrow(exception)

问题在于:我尝试测试上面代码片段中的异常处理程序。我们使用的是Groovy(看起来像是3.0.9),第一次测试根本没有引发异常,代码继续运行(在代码后面会导致一个NPE)。“myService”是一个创建PDF文档的服务,这些文档作为InputStream对象返回。
替代测试(这实际上是我最初尝试的)导致一个groovy错误,告诉我()没有可调用的方法(????)然后继续给予我一个与代码匹配的示例。唉。我想做的就是当readAllBytes()方法是抛出一个IOException。仅此而已。我已经浏览了大量的博客、帖子我认为如果我们使用JUnit而不是Groovy,这个问题是可以解决的,但是在这个过程中的这个点上,这种透视并不是一个真正的选择--有太多的测试需要转换。
升级到更新的版本会有帮助吗?或者我们只是听天由命,不能有效地测试那部分代码?

js81xvg6

js81xvg61#

所以是的,使用mocking是你想要做的。但是,我在Mockito + Groovy上遇到了问题。我所有的问题都通过将我的测试转换成使用Mockito的Java来解决了。看起来你也在使用Spock,它提供了Mock,Stub和Spy。对于你想要做的事情,我会说你想要Mock。

InputStream pdfDocument = Mock(InputStream.class)
pdfDocument.readAllBytes >> { throw new IOException("test test") }
myService = Mock(MyService)
myService. generate() >> pdfDocument

// test code here!

相关问题