16/12/2004
…Tiếp nối phần trước
Tháng 8 năm 1939, Hilter và Stalin kí kết hiệp ước đình chiến. Mặc dù hiệp ước giữa những kẻ thù cùng tư tưởng thật sự không được phổ biến với những người Cộng sản châu Âu và Mỹ, kết quả thực tế cho thấy vào cuối năm 1940 Liên bang Xô viết đã chiếm được một nửa phía đông Ba Lan và sáp nhập các quốc gia vùng Baltic; phát triển mạnh mẽ đế chế và tạo nên một biên giới dài chung với nước Đức.
Trôi qua vài năm, Stalin đã ngấm ngầm đưa mạng lưới gián điệp vào trong các cấp cao nhất của chính phủ Hoa Kỳ. Một thành viên của mạng lưới này, Whittaker Chambers, người vô cùng tức giận trước sự “thân thiết” đang lớn dần giữa Stalin và Hitler, đã đào thoát sang Mỹ trong năm 1938. Chambers cung cấp cho chính quyền Roosevelt thông tin chi tiết của hàng tá điệp viên đảng cộng sản khác. Một trong những điệp viên này, Alger Hiss, là một quan chức cấp cao Bộ Ngoại giao và là đối tác tin cậy của FDR. FDR thay vì từ chối không tin vào các cáo buộc chống lại Hiss và lên án Chmabers – lại cho phép mạng lưới của Stalin tiếp tục hoạt động đến năm 1940.
Vì lẽ đó Stalin biết tất cả về Nimbus, bao gồm nghiên cứu về bom nguyên tử, và sự thành công của tên lửa Von Braun. Stalin cũng biết ông ta không thể một mình chống đối lại được mối đe dọa ngày càng lớn từ nước Mỹ. Vậy nên những tháng đầu tiên của năm 1941, ông ta đàm phán về một liên minh vững chắc với Hitler và các thế lực Axis, cung cấp tin tức tình báo về Nimbus như là một phần của thỏa thuận.
Hoa Kỳ đã từng độc quyền chiếm giữ những ý tưởng vĩ đại, nhưng những bí mật của họ lại bị bán đi và họ đã đánh mất yếu tố gây bất ngờ. Giờ thì một cường quốc Á-Âu đang phát triển nhanh chóng và lên kế hoạch chống lại họ.
21/2/2002, 1430
Jean không cho chúng tôi có phút nào để phản hồi, “Avery và tôi đã có một cuộc trò chuyện nhỏ rất tuyệt vời, và tôi nghĩ chúng tôi đã giải quyết xong xuôi mọi việc rồi. Cậu không đồng ý sao Avery? Tôi biết cậu là một người đàn ông trẻ tốt tính, thực ra chỉ là có chút bốc đồng. Cậu sẽ không làm quá lên như thế nếu cậu không để tâm đến, đúng chứ? Dĩ nhiên là cậu không như thế rồi. Dù sao thì, Jerry và Alphonse, tôi sẽ để lại Avery cho các cậu quản lý và tiếp tục như thế cho đến hết ngày. Ôi chúa ơi, đừng bắt tôi phải quan tâm đến quá nhiều tiểu tiết như thế! Nó sẽ chẳng ra sao cả, các chàng trai ạ, chẳng ra làm sao cả.” Và rồi bà ấy lấy giỏ đan len của mình lên và di chuyển chậm chạp tới chỗ Carole nói chuyện.
Avery chỉ đứng đó với dáng vẻ ngượng ngùng trong khi tôi và Jerry đút tay vào túi và nhìn xuống sàn nhà. Cuối cùng Jerry nói: “Tao rất vui vì mày đã ra khỏi đó Avery. Chẳng vui vẻ gì khi ở trong đó cả. – tao biết chứ. Nghe này, tao phải làm việc với Jasper một lúc. Alphonse, mày có thể cùng với Avery hoàn thành trang kiểm thử này không?”
Anh ta để tôi lại một mình với Avery sau vụ trừng phạt! Tôi nên nói gì với hắn đây? “Chắc rồi, Jerry, chúng tôi sẽ tiếp tục công việc.”
“Tuyệt, cảm ơn. Tao sẽ trở lại sau khoảng một tiếng hoặc hơn.” Và Jerry bỏ đi.
“Mày ở đó rất lâu rồi đấy.” Tôi nói với Avery. “Có tệ lắm không? Bà ấy đã nói gì thế? Bà ấy có quát mày không? Tao thấy rất tệ khi nhìn thấy mày ở trong đó.”
“Ừ, ờ thì, Jerry đã đúng khi nói rằng nó chẳng vui chút nào. Bà ấy thực ra không quát nạt, nhưng … Nghe này, tao có lẽ không nên nói quá nhiều về nó. Bà ấy giúp tao nhận ra một vài thứ ở bản thân mà tao không hề thích. Tao sẽ suy nghĩ về chúng một lúc. Có lẽ tao có thể kể cho mày nhiều hơn vào thời điểm khác, nhưng giờ tao chỉ muốn trở lại làm việc; nếu mày không phiền.”
“Ồ, phải, chắc rồi. Không sao đâu. Tao sẽ chỉ cho mày cái bọn tao đang làm.”
“… và Alphonse, nó có nghĩa là mày quan tâm đến tao rất nhiều. Cảm ơn nha.”
“Ề, được rồi… ừ, tất cả đều ở đây. Jerry và tao đang làm ở trang Đăng ký Bộ đồ thường. Bọn tao mới chỉ làm cho cái bảng đầu tiên không chạy được thành công. Tao và mày sẽ làm cái bảng thứ hai cũng bị lỗi qua được.”
Tôi chỉ vào trang và Avery nghiên cứu nó.
“Được rồi, vậy chúng ta muốn nhận được tin nhắn gửi đến bảng sản xuất đang hoạt động?”
“Đúng thế.” Tôi nói. “Chúng ta muốn đảm bảo rằng khi chúng ta đăng ký bộ đồ trong bảng Yêu cầu đăng ký đồ bảo hộ, một tin nhắn được gửi tới nhà sản xuất với thông tin đăng ký.”
“OK, chà trông có vẻ rất dễ để làm nó qua được. Tất cả những gì chúng ta phải làm là sửa phương thức getLastMesageTo Manufacturing() như sau:”
public class Utilities {
...
public static Object getLastMessageToManufacturing() {
SuitRegistrationMessage message = new SuitRegistrationMessage();
message.sender = "Outside Maintenance";
message.id = "Suit Registration";
message.argument = 314159;
return message;
}.
..
}
Thế là đủ để bảng chuyển thành màu xanh.
“Ừ, tao cũng nghĩ như thế đấy. Nhưng Jerry bảo tao không được làm như vậy. Anh ta nói sẽ ổn khi làm điều đơn giản nhất để có kiểm thử đơn vị thành công; nhưng không được như thế với kiểm thử chấp nhận. Anh ấy nói rằng nếu mày nhất quyết làm điều gì đó quá đơn giản để có được kiểm thử chấp nhận thành công, mày nên viết một vài kiểm thử đơn vị thay thế vào.”
Avery trông bối rối. “Chúng ta nên viết kiểm thử đơn vị theo kiểu nào?”
“Chà, chúng ta muốn đảm bảo rằng chúng ta đã gửi một tin nhắn tới nơi sản xuất khi một bộ đồ được đăng ký.”
“Ừ, nhưng đó là cái mà kiểm thử chấp nhận kiểm tra.”
Hắn ta tán thành: “Mày nói đúng.”
“Ừ, có muốn hai đứa mình viết một kiểm thử đơn vị kiểm tra thứ giống y hệt như của kiểm tra chấp nhận không?”
Hắn ta lạị suy xét thêm lần nữa. “Mày nói lại đúng nữa rồi.”
“Vậy chúng ta làm cái gì?” Avery rõ ràng đang cố gắng chống lại sự hoài nghi của mình. Nếu hắn lại nóng vội ngay khi mới rời phòng trừng phạt, Jean có lẽ sẽ nhốt hắn ở đó mãi mãi.
“Nhìn này, viết một kiểm thử đơn vị không phải là vấn đề quá lớn. Nếu nó xảy ra trùng lặp với kiểm thử chấp nhận thì cũng kệ nó đi. Hãy chỉ viết kiểm thử đơn vị và đưa cho Jerry xem khi anh ta quay lại.”
“Chắc rồi, tiếp tục đi.”
Vậy nên Avery tóm lấy bàn phím và viết:
public class UtilitiesTest extends TestCase {
...
public void testRegisterSuitSendsMessageToMfg() throws Exception {
Utilities.registerSuit(7734);
SuitRegistrationMessage message =
(SuitRegistrationMessage) Utilities.getLastMessageToManufacturing();
assertEquals("Suit Registration", message.id);
assertEquals("Outside Maintenance", message.sender);
assertEquals(7734, message.argument);
}
}
Nó thất bại vì lý do sau:
expected:<7734> but was:<314159>
“Được rồi, giờ nếu chúng ta làm theo nguyên tắc của Jerry và làm nó thất bại theo cách đơn giản nhất có thể, chúng ta phải thay đổi getLastMessageFromManufacturing lần nữa.”
public static Object getLastMessageToManufacturing() {
SuitRegistrationMessage message = new SuitRegistrationMessage();
message.sender = "Outside Maintenance";
message.id = "Suit Registration";
message.argument = 7734;
return message;
}
Tôi nhấn vào kiểm thử đơn vị và kiểm thử chấp nhận. “Được rồi, giờ kiểm thử đơn vị đã qua được, nhưng kiểm thử chấp nhận lại thất bại.”
“Hừm”. Avery nói.
“Đúng vậy đó.” Tôi đáp.
“Tao đã nói rồi mà!” Avery nói.
“Thật mà!” Tôi đáp.
Chúng tôi nhìn nhau và cười một lúc.
“Được rồi, tao đang dàn hiểu được logic của Jerry.” Avery nói. “Để cả hai kiểm thử thành công, chúng ta phải làm điều gì đó thông minh. Chúng ta không thể mãi làm thứ quá đơn giản được.”
“Mày đang có ý gì trong đầu rồi à?”
“Ừ, xem đây.” Và Avery bắt đầu gõ lần nữa.
public class Utilities {
...
private static Manufacturing manufacturing = new MockManufacturing();
...
public static void registerSuit(int barCode) {
manufacturing.registerSuit(barCode);
} p
ublic static Object getLastMessageToManufacturing() {
SuitRegistrationMessage message =
(SuitRegistrationMessage) manufacturing.getLastMessage();
return message;
}.
..
} p
ackage dtrack.external;
public interface Manufacturing {
public void registerSuit(int barCode);
public Object getLastMessage();
}p
ackage dtrack.mocks;
import dtrack.external.Manufacturing;
import dtrack.messages.SuitRegistrationMessage;
public class MockManufacturing implements Manufacturing {
private Object lastMessage;
public void registerSuit(int barCode) {
SuitRegistrationMessage msg = new SuitRegistrationMessage();
msg.id = "Suit Registration";
msg.sender = "Outside Maintenance";
msg.argument = barCode;
lastMessage = msg;
} p
ublic Object getLastMessage() {
return lastMessage;
}
}
“Oa.” Tôi nói trong sự ngưỡng mộ khi nhấn các nút kiểm tra. “Giờ các kiểm thử đơn vị đều thành công, và cả tin nhắn tới bảng sản xuất cũng thế.”
“Ừ.” Avery nói. Nhưng lông mày hắn nhíu lại. “Tao không thích điều này. Đối tượng Mock không nên tạo ra tin nhắn. Điều này nên được làm bởi đối tượng Manufacturing thật. Tao cũng không thích biến đối số trong tin nhắn, hoặc trong thực tế lớp Utilities này đang sắp chuyển thành nồi thập cẩm rồi. Đoạn mã này thật quá lộn xộn. Nó thật sự cần được dọn dẹp.”
“Ừ, tao tán thành. Tao cũng nói như thế với Jerry ngay trước khi mày trở lại.”
“Bọn mình có nên dọn dẹp nó trước khi anh ta quay về đây không?”
Tôi có chút lo lắng về điều này. Tôi không muốn làm Jerry nổi điên khi thay đổi những thứ mà anh ta chưa thực sự muốn thay đổi. Mặt khác, đoạn mã này là mớ lộn xộn, và nếu chúng tôi không dọn nó anh ta hẳn cũng sẽ có thể tức giận về việc này.
“Được thôi.” Tôi nói. “Hãy xem chúng ta gây ra được bao nhiêu thiệt hại trước khi Jerry trở về nào!”
“Thật chứ!”
“Rõ ràng quá còn gì!”
Vẫn còn tiếp…
Xem thêm về Tạp chí lập trình Vol.4 tại đây
Đăng ký nhận bộ tài liệu kỹ năng dành cho lập trình viên (video hướng dẫn + slide) tại đây