2014-09-22 110 views
2

如何編寫一個簡單的ABAP單元斷言語句來檢查任何調用,表達式或其他語句的計算結果是否爲真?在ABAP單元中的布爾斷言

我看不到CL_AUNIT_ASSERT中的任何基本的assert()或assert_true()方法,但我期望這些方法很常見。我可以近似如下的斷言,但是沒有更清晰的方法嗎?

cl_aunit_assert=>assert_equals(
    act = boolc(lv_value > 100 OR lv_value < 2) 
    exp = abap_true) 

cl_aunit_assert=>assert_equals(
    act = mo_model->is_active) 
    exp = abap_true) 
+0

嗯,也許這是因爲在ABAP沒有布爾類型? – Jagger 2014-09-22 15:56:04

+1

我剛剛有了一個頓悟。沒有布爾類型,但在這種情況下,您可以簡單地使用'ASSERT_INITIAL'或'ASSERT_NOT_INITIAL',因爲布爾值由'X'(true)或空格(false)模擬。後者是ABAP中的初始值。 – Jagger 2014-09-25 07:51:28

回答

2

根據您的SAP NetWeaver堆棧,你可以(或應該)使用更新的ABAP單元類「CL_ABAP_UNIT_ASSERT 」。該課程的基礎版本爲7.02。 SAP將這個類聲明爲'FINAL',所以不可能從它繼承,但是另一方面,他們添加了一些ASSERT方法...如同ASSERT_TRUE方法一樣... !

下面是這種方法的一個可能的用法:

cl_abap_unit_assert=>assert_true(
    exporting 
    act    = m_ref_foo->is_bar(l_some_var) 
    msg    = |is_bar Method fails with Input { l_some_var } | 
). 
+1

請考慮通過編輯鏈接重新格式化您的答案 – 2016-11-04 06:29:51

+0

有趣的,不知道那一個。我希望'FINAL'標誌只是一個疏忽 - 刪除該標誌會使遷移變得更容易。 – vwegert 2016-11-04 06:53:55

+0

「* SAP將此類聲明爲最終*」當然他們確實......看起來像其他人[也對此評論](https://archive.sap.com/discussions/thread/3173204)奇怪的是, t似乎是正在添加的ASSERT_TRUE的在線文檔。我發現的所有內容都是7.0版本的過時方法列表。但我已經在7.40系統上檢查了這個類,並確認了方法在那裏(儘管類文檔在這裏也是過時的),這對於我原來的問題來說是最接近的標準解決方案,所以我會將其標記爲已接受回答。 – Lilienthal 2016-11-04 12:22:15

2

對於我有權訪問的版本,可能沒有比您列出的版本更短的方法。您可以創建CL_AUNIT_ASSERT的子類並添加自己的靜態ASSERT_TRUE方法。這樣做並不是一個壞主意,同時使您的本地ABAP單元測試類成爲ZCL_AUNIT_ASSERT的一個子類 - 這樣,您可以省略cl_aunit_assert=>前綴,這將節省一些擊鍵。

2

您看不到這樣的方法,因爲在ABAP中沒有布爾類型。

而在Java,C++或C,你能條件的結果分配給一個變量,像這樣

int i = 5; 
boolean result = i > 3; 

你不能做ABAP同樣的事情,也沒有布爾類型。因此,其他語言中的其他語言是單行的,在ABAP中它總是更加冗長。

DATA: i TYPE i VALUE 5. 
DATA: result TYPE abap_bool. 

IF i > 3. 
    result = abap_true. 
ELSE. 
    result = abap_false. 
ENDIF. 

你用過的東西似乎是一個新的功能,最近已添加到語言和大部分的客戶將不被使用了很長時間。此外,CL_AUNIT_ASSERT類是在新元素出現之前創建的。

因此,現在有可能將上述內容寫成一行。但是,該語言中仍然沒有布爾類型。

DATA: i TYPE i VALUE 5. 
DATA: result TYPE abap_bool. 

result = boolc(i > 3). 

在另一方面,也沒有布爾類型,但是你可以簡單地在這種情況下使用ASSERT_INITIALASSERT_NOT_INITIAL,布爾由要麼X(真)或空間(假)效仿。後者是ABAP中的初始值。

2

最乾淨的方式就是失敗:

if value > limit. 
    cl_abap_unit_assert=>fail(). 
endif. 

或者更翔實: cl_abap_unit=>fail(msg = 'Limit exceeded').