如何将Junit 5的TempDir与Kotlin一起使用?



我想将以下(正在工作的(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);
}
}

随着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)
}
}

但这无法初始化:

org.junit.jupiter.api.extension.ExtensionConfigurationException: @TempDir field [private java.io.File my.project.MyTempFileTest.tempFolder] must not be private.

然而,把public放在var前面并没有什么区别。我收到了同样的错误消息,IntelliJ甚至建议再次删除明显"冗余"的public

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

@TempDir
@JvmField
var tempFolder: File? = null

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

@field:TempDir
lateinit var tempFolder: File

相关内容

  • 没有找到相关文章

最新更新