unit-testing - Grails 3:在服务方法中传递输入流

标签 unit-testing grails service mocking

我在服务单元测试中有一个奇怪的行为:

我有这样一种方法的服务:

class FileVaultService {

    def grailsApplication

    FileEntry addFile(InputStream iStream) {

        log.debug("Ajout d'un fichier ${iStream} dans le vault.")

        // Do some stuff to copy the iStream in a file...
       Files.copy(iStream, targetFile.toPath())
     }
}

而我的单元测试:
@TestFor(FileVaultService)
@TestMixin(ServiceUnitTestMixin)
@Mock([Folder])
class FileVaultTests extends Specification {

    def log = LogFactory.getLog(getClass())


    void "test basic"() {
        when:
        File testFile = File.createTempFile("test", "test")
        testFile << "I am some content"

        InputStream inputStream = testFile.newInputStream()
        println "inputStream.available() = ${inputStream.available()}"

        FileEntry fileEntry = service.addFile(inputStream)
        println(fileEntry)


        then:
        "I am some content" == new File("${testFileVault}/${fileEntry.parentFolder.currentIndex}", fileEntry.realName).text
   }
}

但是此测试失败:
Stream closed
java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:170)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:336)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at java.nio.file.Files.copy(Files.java:2908)
    at java.nio.file.Files.copy(Files.java:3027)
    at com.sayperhaps.services.FileVaultService.addFile(FileVaultService.groovy:50)
    at com.sayperhaps.service.FileVaultTests.test basic(FileVaultTests.groovy:78)

输入流通过时,这确实很奇怪。
我可以通过一些打印语句或使用调试器来查看它。
但这是封闭的...

我尝试了有无@TestMixin(ServiceUnitTestMixin),但没有区别。

有一种模拟机制可以做一些我错过的魔术吗?

谢谢你的帮助,

最佳答案

好的,我知道了...
问题出在log语句中:

 FileEntry addFile(InputStream iStream) {

    log.debug("Ajout d'un fichier ${iStream} dans le vault.")

一旦将流转换为String,iStream.toString()将关闭流。
绝对不是单元测试框架的问题

关于unit-testing - Grails 3:在服务方法中传递输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33596273/

相关文章:

unit-testing - Entity Framework 4.1 RC POCO - 对生成的字段名称进行单元测试

android - 如何进行 10 次快速点击 [UIautomator]

oracle - Grails:SQLException:找不到适合 jdbc:oracle:thin 的驱动程序

Grails Assets 管道 - 没有可用的

android - 设置 IMediaPlaybackService

android - 如何将诸如 R.raw.twelve_chimes 之类的值从 Activity 传递到服务?

使用 Jasmine 的 TypeScript 中的 AngularJS 单元测试未运行

python - Django单元测试View中 'else'语句实现覆盖

grails - 在 grails 验证器中包含查询时出现堆栈溢出

c# - 未在 Windows 服务中获取 OnStart 事件日志条目