我对服务单元测试有一种奇怪的行为:
我有一个像这样的方法的服务:
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)时尝试过,但没有区别。
是否有模拟机制在做我错过的魔法?
感谢您的帮助,
答案 0 :(得分:0)
好的,明白了...... 问题出在日志声明中:
FileEntry addFile(InputStream iStream) {
log.debug("Ajout d'un fichier ${iStream} dans le vault.")
iStream.toString()将流转换为String后关闭它。 绝对不是单元测试框架的问题