Tôi thường làm việc với các phương thức chấp nhận gọi lại và gọi lại có vẻ khó kiểm tra. Chúng ta hãy xem xét kịch bản sau đây, nếu có một phương thức chấp nhận gọi lại với một phương thức đơn (để đơn giản, tôi giả định phương thức thử nghiệm là đồng bộ), bảng sau có thể được viết chỉ để đảm bảo rằng phương thức gọi lại được gọi:Thử nghiệm đơn vị Java: cách dễ nhất để kiểm tra xem một cuộc gọi lại có được gọi là
@Test
public void testMethod() {
final boolean[] passed = {false};
method(new Callback() {
@Override
public void handle(boolean isSuccessful) {
passed[0] = isSuccessful;
}
});
assertTrue(passed[0]);
}
Dường như đại diện. Tôi muốn biết: là có một cách thanh lịch hơn để kiểm tra mã như vậy để làm cho mã ở trên trông giống như mã giả bên dưới?
@Test
public void testMethod() {
// nothing explicit here, implicit boolean state provided by a test-runner
method(new Callback() {
@Override
public void handle(boolean isSuccessful) {
if (isSuccessful) {
pass(); // not sure how it should look like:
// * an inherited method that sets the state to "true"
// * or an object with the pass method
// * whatever
// but doesn't exit testMethod(), just sets the state
}
}
});
// nothing explicit here too:
// test runner might check if the state is changed to true
// otherwise an AssertionError might be thrown at the end of the method implicitly
}
Làm sạch một chút. Có thể nào trong JUnit, TestNG hoặc bất kỳ khung kiểm thử nào khác không? Cảm ơn!
CẬP NHẬT
Xin lỗi, tôi dường như đã hỏi một câu hỏi mơ hồ mà không thực sự đáp ứng những gì tôi muốn hỏi. Về cơ bản, tôi có nghĩa là bất kỳ mã nào (không nhất thiết phải gọi lại) có thể được gọi nếu một số điều kiện nhất định chỉ được thỏa mãn để đặt trạng thái kết quả thành đúng. Nói một cách đơn giản, tôi chỉ muốn loại bỏ số boolean[] passed
ban đầu và số assertTrue(passed[0])
cuối cùng giả định rằng chúng là một dạng mở đầu và phần kết thúc tương ứng và giả sử rằng trạng thái ban đầu được đặt thành false
do đó cần gọi hàm pass()
để đặt trạng thái là true
. Không có vấn đề cách các passed[0]
được đặt thành true
, bất kể từ đâu. Nhưng tiếc là tôi đã hỏi câu hỏi này bằng ngữ cảnh gọi lại, tuy nhiên đây chỉ là một lựa chọn, không phải là một yêu cầu. Vì vậy, tiêu đề của câu hỏi không phản ánh những gì tôi thực sự muốn hỏi, nhưng trước khi cập nhật một số câu trả lời đã được đăng.
Cảm ơn câu trả lời! Có, Mockito là một lib thực sự tốt đẹp. Thành thật mà nói, tôi đã không đưa các thư viện mocking vào tài khoản: Tôi chỉ muốn loại bỏ lá cờ thay thế và các xác nhận sau. Với Mockito, 'verify' phải được gọi đúng cách. Tôi chỉ nghĩ rằng khẳng định cuối cùng có thể là ngầm định và "được cung cấp" bởi người thử nghiệm. –
Vâng, như tôi đã nói, nó chỉ là một giá trị phù hợp; nếu bạn muốn, bạn có thể thay thế đối số bằng 'true' hoặc thậm chí là' ArgumentCaptor '. –
fge
Tại sao lại là downvote? – fge