วิธีกำจัดกฎ TemporaryFolder ใน Junit5

ฉันกำลังย้ายการทดสอบหน่วยจาก Junit4 ไปยัง Junit5 ในการทดสอบฉันใช้ TemporaryFolder rule จาก Junit4 เอพีไอ เพื่อให้การทดสอบใช้งานได้ต่อไปฉันได้เพิ่มคำอธิบายประกอบ @EnableRuleMigrationSupport:

@EnableRuleMigrationSupport
public final class SomeTest {

    @Rule
    public final TemporaryFolder tmp = new TemporaryFolder();

   // tests ...
}

ตามที่ฉันเข้าใจใน Junit5 ฉันต้องใช้ ส่วนขยาย แทน กฎ แต่ฉันไม่พบสิ่งทดแทนสำหรับ TemporaryFolder ในส่วนขยาย Junit5 มันมีอยู่จริงเหรอ? จะแทนที่กฎ TemporaryFolder ด้วยส่วนขยายอย่างถูกต้องได้อย่างไร


person Kirill    schedule 15.06.2019    source แหล่งที่มา


คำตอบ (1)


คุณสามารถใช้ @TempDir คำอธิบายประกอบ (JUnit 5.4+) อธิบายไว้ใน §2.20.1 ของคู่มือผู้ใช้ JUnit 5 จากคู่มือผู้ใช้ (เน้นของฉัน):

ส่วนขยาย TempDirectory ในตัวใช้เพื่อสร้างและล้างไดเร็กทอรีชั่วคราวสำหรับการทดสอบแต่ละรายการหรือการทดสอบทั้งหมดในคลาสการทดสอบ มันถูกลงทะเบียนตามค่าเริ่มต้น หากต้องการใช้งาน ให้ใส่คำอธิบายประกอบในฟิลด์ที่ไม่ใช่ส่วนตัวประเภท java.nio.file.Path หรือ java.io.File ด้วย @TempDir หรือเพิ่มพารามิเตอร์ประเภท java.nio.file.Path หรือ java.io.File ที่มีคำอธิบายประกอบด้วย @TempDir ให้กับวิธีวงจรชีวิตหรือวิธีทดสอบ

หมายเหตุ: ส่วนขยายนี้ถูกเพิ่มเข้ามาในเวอร์ชัน 5.4 และขณะนี้ (ณ วันที่ 5.7.2) อยู่ในช่วงทดลอง

ตัวอย่างการใช้ฟิลด์อินสแตนซ์:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path; // or use java.io.File

class SomeTests {

    @TempDir
    Path directory; // must be non-private

}

ตัวอย่างการใช้พารามิเตอร์ของวิธีทดสอบ:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.nio.file.Path; // or use java.io.File

class SomeTests {

    @Test
    void testFoo(@TempDir Path directory) {
        // do test...
    }

}

หมายเหตุ: ไม่รองรับพารามิเตอร์ตัวสร้าง

เมื่อสร้างและลบไดเรกทอรีจะมีการอธิบายไว้ใน Javadoc ของ @TempDir:

การสร้างไดเรกทอรีชั่วคราว

ไดเร็กทอรีชั่วคราวจะถูกสร้างขึ้นก็ต่อเมื่อฟิลด์ในคลาสทดสอบหรือพารามิเตอร์ในเมธอดวงจรการใช้งานหรือวิธีทดสอบมีคำอธิบายประกอบด้วย @TempDir หากประเภทฟิลด์หรือประเภทพารามิเตอร์ไม่ใช่ทั้ง Path หรือ File หรือหากไม่สามารถสร้างไดเร็กทอรีชั่วคราวได้ ExtensionConfigurationException หรือ ParameterResolutionException จะถูกส่งออกไปตามความเหมาะสม นอกจากนี้ ParameterResolutionException จะถูกส่งออกไปสำหรับพารามิเตอร์ตัวสร้างที่มีคำอธิบายประกอบด้วย @TempDir

ขอบเขตไดเรกทอรีชั่วคราว

ขอบเขตของไดเร็กทอรีชั่วคราวขึ้นอยู่กับตำแหน่งที่พบคำอธิบายประกอบ @TempDir แรกเมื่อดำเนินการคลาสทดสอบ ไดเร็กทอรีชั่วคราวจะถูกแชร์โดยการทดสอบทั้งหมดในคลาสเมื่อมีคำอธิบายประกอบอยู่ในฟิลด์ static หรือบนพารามิเตอร์ของเมธอด @BeforeAll มิฉะนั้น ตัวอย่างเช่น เมื่อมีการใช้ @TempDir เฉพาะในช่องอินสแตนซ์หรือในพารามิเตอร์ในวิธีทดสอบ @BeforeEach หรือ @AfterEach การทดสอบแต่ละครั้งจะใช้ไดเร็กทอรีชั่วคราวของตัวเอง

การลบไดเรกทอรีชั่วคราว

เมื่อถึงจุดสิ้นสุดของขอบเขตของไดเร็กทอรีชั่วคราว เช่น เมื่อวิธีทดสอบหรือคลาสเสร็จสิ้นการดำเนินการ JUnit จะพยายามลบไฟล์และไดเร็กทอรีทั้งหมดในไดเร็กทอรีชั่วคราวแบบวนซ้ำ และสุดท้ายคือไดเร็กทอรีชั่วคราวนั่นเอง ในกรณีที่การลบไฟล์หรือไดเร็กทอรีล้มเหลว IOException จะถูกโยนทิ้งซึ่งจะทำให้การทดสอบหรือคลาสการทดสอบล้มเหลว

person Slaw    schedule 15.06.2019
comment
และจะทำอย่างไรกับ 5.3 มิถุนายน? ฉันติดอยู่กับเวอร์ชันเก่า ... - person Juh_; 02.03.2020
comment
ฉันไม่คิดว่าจะมีการแทนที่ใน JUnit เวอร์ชันเก่ากว่า 5.4 คุณต้องอัปเกรดเป็น 5.4+ หรือใช้ @EnableRuleMigrationSupport แม้ว่าฉันคิดว่าคุณสามารถเขียนส่วนขยายของคุณเอง ได้ - person Slaw; 02.03.2020