Java 8 ทำให้สิ่งนี้ง่ายขึ้นมากและ Kotlin / Scala เพิ่มขึ้นเป็นสองเท่า
เราสามารถเขียนคลาสอรรถประโยชน์เล็กน้อย
class MyAssertions{
public static void assertDoesNotThrow(FailingRunnable action){
try{
action.run()
}
catch(Exception ex){
throw new Error("expected action not to throw, but it did!", ex)
}
}
}
@FunctionalInterface interface FailingRunnable { void run() throws Exception }
จากนั้นรหัสของคุณจะกลายเป็น:
@Test
public void foo(){
MyAssertions.assertDoesNotThrow(() -> {
//execute code that you expect not to throw Exceptions.
}
}
หากคุณไม่มีสิทธิ์เข้าถึง Java-8 ฉันจะใช้สิ่งอำนวยความสะดวก java แบบเก่าที่เจ็บปวด: บล็อกโค้ดแบบอาริบิทและความคิดเห็นง่าย ๆ
//setup
Component component = new Component();
//act
configure(component);
//assert
/*assert does not throw*/{
component.doSomething();
}
และสุดท้ายด้วย kotlin ภาษาที่ฉันเพิ่งตกหลุมรัก:
fun (() -> Any?).shouldNotThrow()
= try { invoke() } catch (ex : Exception){ throw Error("expected not to throw!", ex) }
@Test fun `when foo happens should not throw`(){
//...
{ /*code that shouldn't throw*/ }.shouldNotThrow()
}
แม้ว่าจะมีเป็นจำนวนมากของห้องพักที่จะคุ้นเคยกับว่าวิธีที่คุณต้องการที่จะแสดงนี้ฉันถูกเสมอแฟนของยืนยันได้อย่างคล่องแคล่ว
เกี่ยวกับ
คุณกำลังเข้าใกล้สิ่งนี้ในทางที่ผิด เพียงทดสอบการทำงานของคุณ: หากมีข้อผิดพลาดเกิดขึ้นการทดสอบจะล้มเหลวโดยอัตโนมัติ หากไม่มีข้อยกเว้นการทดสอบของคุณจะเปลี่ยนเป็นสีเขียว
หลักการนี้ถูกต้อง แต่สรุปไม่ถูกต้อง
Java อนุญาตให้มีข้อยกเว้นสำหรับการไหลของการควบคุม นี้จะกระทำโดยรันไทม์ JRE ตัวเองใน APIs เช่นDouble.parseDouble
ผ่านNumberFormatException
และผ่านPaths.get
InvalidPathException
เมื่อคุณเขียนส่วนประกอบที่ตรวจสอบความถูกต้องของ Number Number Double.ParseDouble
อาจใช้ Regex หรือ parser ที่เขียนด้วยมือหรืออาจเป็นสิ่งที่ฝังกฏโดเมนอื่น ๆ ที่ จำกัด ช่วงของ double เป็นสิ่งที่เฉพาะเจาะจงวิธีที่ดีที่สุดในการทดสอบนี้ องค์ประกอบ? ฉันคิดว่าการทดสอบที่ชัดเจนจะยืนยันว่าเมื่อแยกสตริงผลลัพธ์ออกแล้วจะไม่มีข้อยกเว้นเกิดขึ้น ฉันจะเขียนการทดสอบโดยใช้ด้านบนassertDoesNotThrow
หรือ/*comment*/{code}
บล็อก สิ่งที่ต้องการ
@Test public void given_validator_accepts_string_result_should_be_interpretable_by_doubleParseDouble(){
//setup
String input = "12.34E+26" //a string double with domain significance
//act
boolean isValid = component.validate(input)
//assert -- using the library 'assertJ', my personal favourite
assertThat(isValid).describedAs(input + " was considered valid by component").isTrue();
assertDoesNotThrow(() -> Double.parseDouble(input));
}
ฉันขอแนะนำให้คุณกำหนดพารามิเตอร์การทดสอบนี้input
โดยใช้Theories
หรือParameterized
เพื่อให้คุณได้ง่ายขึ้นสามารถกลับมาใช้การทดสอบนี้สำหรับปัจจัยการผลิตอื่น ๆ อีกทางเลือกหนึ่งถ้าคุณต้องการแปลกใหม่คุณสามารถใช้เครื่องมือทดสอบรุ่น (และสิ่งนี้ ) TestNG ได้รับการสนับสนุนที่ดีกว่าสำหรับการทดสอบแบบกำหนดพารามิเตอร์
สิ่งที่ฉันพบไม่พอใจโดยเฉพาะอย่างยิ่งเป็นคำแนะนำในการใช้@Test(expectedException=IllegalArgumentException.class)
, ข้อยกเว้นนี้เป็นอันตรายในวงกว้าง หากรหัสของคุณเปลี่ยนแปลงเช่นนั้นองค์ประกอบภายใต้ตัวสร้างของการทดสอบมีif(constructorArgument <= 0) throw IllegalArgumentException()
และการทดสอบของคุณจัดหา 0 สำหรับอาร์กิวเมนต์นั้นเพราะสะดวก - และนี่เป็นเรื่องธรรมดามากเพราะข้อมูลทดสอบที่สร้างดีนั้นเป็นปัญหาที่ยากอย่างน่าประหลาดใจ - จากนั้นการทดสอบของคุณ จะเป็นแถบสีเขียวแม้ว่าจะไม่ได้ทดสอบอะไรเลย การทดสอบดังกล่าวแย่กว่าไร้ประโยชน์