如何在 Kotlin 中使用 Junit 5 的 TempDir?

pee*_*eer 2 tempdir temporary-files kotlin junit5

我想将以下(工作)java 测试转换为 Kotlin:

package my.project;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

import static java.util.Collections.singletonList;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class MyTempFileTest {

    @TempDir
    public File tempFolder;

    @Test
    public void testTempFolder() {
        Assertions.assertNotNull(tempFolder);
    }

    @Test
    public void testTempFolderParam(@TempDir File tempFolder) {
        Assertions.assertNotNull(tempFolder);
    }
 }
Run Code Online (Sandbox Code Playgroud)

使用 IntelliJ 的内置转换器,它变成:

package my.project

import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import java.io.File

class MyTempFileTest {
    @TempDir
    var tempFolder: File? = null
    
    @Test
    fun testTempFolder() {
        Assertions.assertNotNull(tempFolder)
    }

    @Test
    fun testTempFolderParam(@TempDir tempFolder: File?) {
        Assertions.assertNotNull(tempFolder)
    }
}
Run Code Online (Sandbox Code Playgroud)

但这无法初始化:

org.junit.jupiter.api.extension.ExtensionConfigurationException: @TempDir field [private java.io.File my.project.MyTempFileTest.tempFolder] must not be private.
Run Code Online (Sandbox Code Playgroud)

不过放在public前面var没有什么区别。我收到相同的错误消息,IntelliJ 甚至建议再次删除明显的“冗余” public

小智 11

从 Kotlin 的角度来看,稍微更惯用的解决方案可确保文件属性的类型不可为空

@field:TempDir
lateinit var tempFolder: File
Run Code Online (Sandbox Code Playgroud)


gix*_*gix 8

您必须使用注释该字段,@JvmField以便 Kotlin 编译器生成实际的公共字段,而不是 getter 和 setter:

@TempDir
@JvmField
var tempFolder: File? = null
Run Code Online (Sandbox Code Playgroud)