The following programs are used in the example: Using MFUPP to Mock and Stub a Program.
$set sourceformat"variable"
program-id. "getCustomerAccountInfo".
working-storage section.
exec sql include sqlca end-exec.
exec sql begin declare section end-exec.
01 ws-lastname pic x(40).
01 ws-customer-id pic 9(9).
01 ws-max-credit pic 9(9).
exec sql end declare section end-exec.
linkage section.
01 lnk-lastname pic x(40).
01 lnk-customer-id pic 9(9).
01 lnk-max-credit pic 9(9).
01 lnk-account-active pic x.
procedure division using lnk-lastname,
lnk-customer-id,
lnk-max-credit,
lnk-account-active.
*> setup
call "LoginPrompt"
if return-code not equal 0
goback returning 2
end-if
*> get customer id, from customer name
call "getCustomerId" using
by reference lnk-lastname,
by reference lnk-customer-id
end-call
*> the customer is not found, we have no limit and account
*> is not active
if lnk-customer-id equal 0
move 0 to lnk-max-credit
move "n" to lnk-account-active
goback returning 1
end-if
*> lookup the credit limit
call "getCustomerCreditLimit" using
by reference lnk-customer-id
by reference lnk-max-credit
end-call
move "y" to lnk-account-active
goback returning 0.
credit-limit section.
entry "getCustomerCreditLimit" using
by reference lnk-customer-id
by reference lnk-max-credit.
call "should not get here"
move lnk-customer-id to ws-customer-id
EXEC SQL
SELECT ActiveCreditLimit INTO :ws-max-credit
FROM CreditInformation
WHERE Id = :ws-customer-id
END-EXEC
*> did it work?, if so return the authors last name
*> otherwise return spaces
if SQLCODE equal 0
move ws-customer-id to lnk-max-credit
else
move 0 to lnk-max-credit
end-if
goback returning 0.
login-prompt section.
entry "LoginPrompt".
EXEC SQL
CONNECT WITH PROMPT
END-EXEC
goback returning SQLCODE.
end program getCustomerAccountInfo.
$set sourceformat"variable"
*> cobol-lint ignore credit-limit
program-id. "getCustomerID".
working-storage section.
exec sql include sqlca end-exec.
exec sql begin declare section end-exec.
01 ws-lastname pic x(40).
01 ws-customer-id pic 9(9).
01 ws-max-credit pic 9(9).
exec sql end declare section end-exec.
linkage section.
01 lnk-lastname pic x(40).
01 lnk-customer-id pic 9(9).
01 lnk-max-credit pic 9(9).
01 lnk-account-active pic x.
procedure division using lnk-lastname,
lnk-customer-id,
lnk-max-credit,
lnk-account-active.
*> setup
call "LoginPrompt"
if return-code not equal 0
goback returning 2
end-if
*> get customer id, from customer name
call "getCustomerId" using
by reference lnk-lastname,
by reference lnk-customer-id
end-call
*> the customer is not found, we have no limit and account
*> is not active
if lnk-customer-id equal 0
move 0 to lnk-max-credit
move "n" to lnk-account-active
goback returning 1
end-if
*> lookup the credit limit
call "getCustomerCreditLimit" using
by reference lnk-customer-id
by reference lnk-max-credit
end-call
move "y" to lnk-account-active
goback returning 0.
credit-limit section.
entry "getCustomerCreditLimit" using
by reference lnk-customer-id
by reference lnk-max-credit.
call "should not get here"
move lnk-customer-id to ws-customer-id
EXEC SQL
SELECT ActiveCreditLimit INTO :ws-max-credit
FROM CreditInformation
WHERE Id = :ws-customer-id
END-EXEC
*> did it work?, if so return the authors last name
*> otherwise return spaces
if SQLCODE equal 0
move ws-customer-id to lnk-max-credit
else
move 0 to lnk-max-credit
end-if
goback returning 0.
login-prompt section.
entry "LoginPrompt".
EXEC SQL
CONNECT WITH PROMPT
END-EXEC
goback returning SQLCODE.
end program getCustomerID.
$set sourceformat"variable"
program-id. MFUT_TESTCUSTOMER.
working-storage section.
copy "mfunit.cpy".
01 p procedure-pointer.
01 ws-lastname pic x(40).
01 ws-customer-id pic 9(9).
01 ws-max-credit-limit pic 9(9).
01 ws-account-active pic x.
local-storage section.
linkage section.
$region Mock Linkage
01 lnk-program-to-mock pic x(MFU-PP-CONTROLLER-PRG-SIZE).
01 lnk-program-to-mock-len binary-long.
01 lnk-redirect-to pic x(MFU-PP-REDIRECT-PRG-SIZE).
01 lnk-redirect-to-len binary-long.
01 lnk-who pic x(MFU-PP-REDIRECT-PRG-SIZE).
01 lnk-who-len binary-long.
$end-region
01 lnk-lastname pic x(40).
01 lnk-customer-id pic 9(9).
01 lnk-max-credit pic 9(9).
procedure division.
*> test-case 1 - Do we have a smith?
move "Smith" to ws-lastname
display "TestCase 1 : Do we have a 'Smith'?"
move 0 to ws-customer-id
call "getCustomerAccountInfo" using
by reference ws-lastname
by reference ws-customer-id
by reference ws-max-credit-limit
by reference ws-account-active
end-call
perform show-customer-info
if ws-customer-id not equal 42
exhibit named ws-customer-id
goback returning 10
end-if
*> test-case 2 - Do we have a jones?
move "Jones" to ws-lastname
display "TestCase 2 : Do we have a 'Jones'?"
move 0 to ws-customer-id
call "getCustomerAccountInfo" using
by reference ws-lastname
by reference ws-customer-id
by reference ws-max-credit-limit
by reference ws-account-active
end-call
perform show-customer-info
if ws-customer-id not equal 21
exhibit named ws-customer-id
goback returning 20
end-if
*> test-case 3 - Do we have a Blobby? (we don't)
move "Blobby" to ws-lastname
display "TestCase 3 : Blobby is no longer with us"
move 0 to ws-customer-id
call "getCustomerAccountInfo" using
by reference ws-lastname
by reference ws-customer-id
by reference ws-max-credit-limit
by reference ws-account-active
end-call
perform show-customer-info
if ws-customer-id not equal 0
exhibit named ws-customer-id
goback returning 30
end-if
display "ALL Passed"
goback returning 0.
show-customer-info section.
display " Customer : " ws-lastname
display " Internal Id : " ws-customer-id
display " Max Credit Limit : " ws-max-credit-limit
display " Active active? : " ws-account-active
.
test-customer-startup section.
entry "MFUM_TESTCUSTOMER".
move "MOCK-CONTROLLER" to MFU-MD-PP-CONTROLLER
move "MOCK-REDIRECTOR" to MFU-MD-PP-REDIRECTOR
goback.
$region Mock Handler
*>---------------------------------------------------------------
*> Controller entry-point used to decide what action to take
*>---------------------------------------------------------------
entry "MOCK-CONTROLLER" using by reference lnk-program-to-mock
by value lnk-program-to-mock-len
.
call "CBL_DEBUGBREAK"
display " MOCK-CONTROLLER: [" lnk-program-to-mock(1:lnk-program-to-mock-len) "]"
evaluate function upper-case(lnk-program-to-mock(1:lnk-program-to-mock-len))
when "LOGINPROMPT@GETCUSTOMERACCOUNTINFO"
goback returning MFU-PP-ACTION-GOBACK
when "GETCUSTOMERID"
goback returning MFU-PP-ACTION-REDIRECT
when "GETCUSTOMERCREDITLIMIT@GETCUSTOMERACCOUNTINFO"
goback returning MFU-PP-ACTION-REDIRECT
when "GETCUSTOMERACCOUNTINFO"
goback returning MFU-PP-ACTION-DO-NOTHING
when other
display "INFO: Should this be mocked? "
lnk-program-to-mock(1:lnk-program-to-mock-len)
goback returning MFU-PP-ACTION-DO-NOTHING
end-evaluate
goback returning MFU-PP-ACTION-DO-NOTHING.
*>---------------------------------------------------------------
*> Program redirector entry-point used to decide where to send
*> mocked program too.
*>---------------------------------------------------------------
entry "MOCK-REDIRECTOR" using by reference lnk-redirect-to
by value lnk-redirect-to-len
by reference lnk-who
by value lnk-who-len.
*> default: just pre-prepend MOCK in the name... lazy..
string "MOCK-" delimited by size
lnk-who(1:lnk-who-len) delimited by size
into lnk-redirect-to(1:lnk-redirect-to-len)
end-string
inspect lnk-redirect-to(1:lnk-redirect-to-len)
replacing all "@" by "-"
goback.
$end-region
$region Mock getCustomerId
entry "MOCK-getCustomerId" using lnk-lastname,
lnk-customer-id
.
move 0 to lnk-customer-id
evaluate lnk-lastname
when "Smith" move 42 to lnk-customer-id
when "Jones" move 21 to lnk-customer-id
end-evaluate
goback.
$end-region
$region Mock getCustomerCreditLimit in getCustomerAccountInf
entry "MOCK-getCustomerCreditLimit-getCustomerAccountInfo" using
by reference lnk-customer-id
by reference lnk-max-credit.
evaluate lnk-customer-id
when 42 move 12345 to lnk-max-credit
when 21 move 54321 to lnk-max-credit
goback.
$end-region
end program MFUT_TESTCUSTOMER.