代码(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,这个问题是可以解决的,但是在这个过程中的这个点上,这种透视并不是一个真正的选择--有太多的测试需要转换。
升级到更新的版本会有帮助吗?或者我们只是听天由命,不能有效地测试那部分代码?
1条答案
按热度按时间js81xvg61#
所以是的,使用mocking是你想要做的。但是,我在Mockito + Groovy上遇到了问题。我所有的问题都通过将我的测试转换成使用Mockito的Java来解决了。看起来你也在使用Spock,它提供了Mock,Stub和Spy。对于你想要做的事情,我会说你想要Mock。