Kata #2: BankAccount

Lưu ý: Mỗi hôm làm tiếp thẳng tại project ngày hôm trước, commit tiếp vào chỗ cũ như hôm trước. Khi nào xong hẳn cả 9 mục thì mới mở project khác để làm lại từ đầu

Một tài khoản ngân hàng (bank account) chứa những thông tin sau
  • accountNumber: Số tài khoản (chuỗi 10 chữ số)
  • balance: Số tiền hiện có trong tài khoản
  • openTimestamp: thời điểm mở tài khoản.

    Tài khoản ngân hàng cho phép thực hiện các thao tác sau: mở tài khoản, gửi tiền, rút tiền, xem lịch sử giao dịch. Thông tin về các tài khoản cũng như các thao tác withdraw và deposit cần ghi lại trong CSDL để phục vụ việc tra cứu sau này.

    Nhiệm vụ: viết lớp BankAccount theo yêu cầu trên. Dùng mock để có thể test độc lập BankAccount với CSDL, thời gian hệ thống. Gợi ý các bước như sau (mỗi bước có thể bao gồm nhiều test):

    1. Mở được tài khoản mới, open (accountNumber), mở tài khoản mới với balance = 0.

    2. Tài khoản có tính persistent. BankAccount.getAccount(accountNumber) cho phép lấy thông tin tài khoản có số tài khoản được cho làm tham số. Dùng mock của BankAccountDao cho nhiệm vụ tương tác với CSDL.

    3. BankAccount.deposit(accountNumber, amount, description) gửi thêm tiền vào tài khoản. Kết quả là số tiền trong tài khoản (balance) tăng thêm một lượng bằng amount.

    4. thông tin về một lần deposit được lưu lại trong CSDL dưới dạng (accountNumber, timestamp, amount, description). Trong đó timestamp là thời điểm deposit được thực hiện. Cần mock phần lấy giờ hiện tại để phục vụ cho việc test.

    5. BankAccount.withdraw(accountNumber, amount, description) rút tiền khỏi tài khoản. kết quả là số tiền trong tài khoản (balance) giảm đi một lượng bằng amount

    6. thông tin về một lần withdraw được lưu lại trong CSDL dưới dạng (accountNumber, timestamp, amount, description), trong đó -amount là số tiền đã rút. Còn lại tương tự như deposit.

    7. lấy danh sách các giao dịch đã thực hiện đối với một tài khoản BankAccount.getTransactionsOccurred(accountNumber). Chỉ cần test tương tác với DAO, nghĩa là kiểm tra xem có gọi đúng hàm, đúng tham số hay không.

    8. lấy danh sách các giao dịch đã được thực hiện trong một khoảng thời gian startTime <= t < stopTime. BankAccount.getTransactionsOccurred(accountNumber, startTime, stopTime). Chỉ cần test tương tác với DAO, nghĩa là kiểm tra xem có gọi đúng hàm, đúng tham số hay không.

    9. lấy danh sách n giao dịch mới nhất đã được thực hiện. Chỉ cần test tương tác với DAO, nghĩa là kiểm tra xem có gọi đúng hàm, đúng tham số hay không.

    10. Khi mở tài khoản mới, cần lưu vào CSDL timestamp của việc mở tài khoản. Lưu ý là bước này đòi hỏi phải sửa lại tất cả các test có dính líu đến mở tài khoản. Nên nghĩ đến việc refactor để sử dụng các hàm tiện ích phục vụ việc setup môi trường test.