ה-assert ב-Java הוא כלי רב-עוצמה המיועד לבדיקת תקינות לוגית במהלך פיתוח ובדיקות (Testing). הוא מאפשר למתכנת להגדיר תנאים שחייבים להתקיים בנקודה מסוימת בקוד, ואם התנאי אינו מתקיים, התוכנית תעצור ותזרוק AssertionError.
לפני הכל, assert אינו פועל בצורה אוטומטית ויש להפעילו! אין לבלבל בין assert לבין assertEquals שפועל בצורה אוטומטית.
איך נפעיל assert? נוסיף ב vm arguments את הערך ea- . ללא הערך הזה, assert לא יפעל ולא יוציא שגיאה במצב שבו אנו מצפים לשגיאה. ניתן להריץ את האפליקציה שלנו עם הפרמטר הזה על ידי הפקודה הבאה: java -ea appName
אין להשתמש ב assert כבדיקה בסביבת production. זה משמש אותנו המפתחים כבדיקה שלנו, בהרצת הקוד לפני שחרורו הסופי. אם נשאיר בקוד את הבדיקה וה vm arguments מוגדר, יכולה לעוף לנו שגיאת AssertionError בזמן ריצה.
ישנן שתי דרכים להשתמש ב-assert:
בדוגמה הבאה ניתן לראות שימוש עם assert שבודק כי הסכום שהוכנס הוא חיובי , הבדיקה הבאה כי היתרה שלנו גדולה מאפס.
שימו לב שזה הדרך בה יש גם הודעה מה ביצענו בבדיקת ה assert. ללא ההודעה, אם הייתה טעות באחת מהבדיקות, לא היינו יודעים מה נפל בבדיקה
public class BankAccount {
private double balance;
public void withdraw(double amount) {
assert amount > 0 : "positive amount: " + amount;
balance -= amount;
assert balance >= 0 : "balance under zero!";
}
}
בזמן הרצת טסטים, לעיתים נרצה לוודא מצב פנימי של אובייקט תוך כדי הריצה של ה-Test. כדי שה-assert יעבוד בטסטים שלך, עליך לוודא שה-VM של ה-Test מוגדר עם הדגל -ea.
| מאפיין | תיאור |
|---|---|
| assertEquals | org.junit.jupiter.api.Assertions.assertEquals - נועד לטסטים, וכל עוד יש לנו את הimport הנכון, הוא תמיד ירוץ. |
| assert (Java keyword) | Keyword - נועד לבדיקת לוגיקה פנימית. הוא ירוץ רק אם ה-JVM הופעל עם ea-. |
דוגמה לקוד המשלב assert ו assertEquals :
השורה הזאת אחראית על ריצת הטסט עצמו ועל קוד שאנו רוצים לבדוק, תפעל תמיד כל עוד הimport נכון.
השורה הזאת תפעל רק כשנריץ את ה vm arguments הנכון.
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class BankAccountTest {
@Test
void testWithdrawalLogic() {
BankAccount account = new BankAccount();
account.withdraw(100);
assertEquals(0, account.getBalance(), "balance should be zero 0");
assert account.getBalance() >= 0 : "balance is zero!";
}
}