我在服务单元测试中有一个奇怪的行为:
我有这样一种方法的服务:
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/