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

时间:2015-11-08 16:37:06

标签: 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)时尝试过,但没有区别。

是否有模拟机制在做我错过的魔法?

感谢您的帮助,

1 个答案:

答案 0 :(得分:0)

好的,明白了...... 问题出在日志声明中:

 FileEntry addFile(InputStream iStream) {

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

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