Tôi có một lớp học Foo
là SUT và lớp học Bar
, là cộng tác viên của nó. Foo
gọi run(List<Object> values)
trên Bar
với "expectedList
" làm đối số. Sau đó, Foo
sẽ thêm một vài yếu tố nữa vào số List
này để trạng thái của nó sẽ khác với thời điểm gọi là run()
. Đây là trường hợp thử nghiệm của tôi.Mockito có thể xác minh các tham số dựa trên giá trị của chúng tại thời điểm gọi phương thức không?
@Test
public void testFoo() {
Bar collaborator = spy(new Bar());
Foo sut = new Foo(collaborator);
verify(collaborator).run(expectedList);
}
Lưu ý rằng cộng tác viên thực sự là đối tượng gián điệp chứ không phải là mô hình. Trường hợp kiểm tra này sẽ thất bại vì mặc dù run()
được gọi với đối số bằng expectedList
, nó đã được sửa đổi vì giá trị hiện tại của nó không còn bằng expectedList
. Tuy nhiên, đây là cách nó được cho là hoạt động, vì vậy tôi tự hỏi liệu có cách nào để Mockito lưu trữ ảnh chụp các tham số khi phương thức được gọi và xác minh chúng dựa trên các giá trị này thay vì các giá trị gần đây nhất.
Vâng David đúng. Do cách API của Mockito được tạo nên nó không thể xác minh nhiều cuộc gọi với cùng tham chiếu đối số. EasyMock có thể làm điều đó bởi vì nó có một giai đoạn mong đợi trước khi mã sản xuất được chạy. Dù sao thay vì 'Trả lời' tôi sử dụng' ArgurmentCaptor' và viết một hoặc nhiều xác nhận vào trạng thái cuối cùng của danh sách đó, tức là với FEST-Assert 'assertThat (captor.getValue()). Chứa (" A "," B ") .contains (" T "," U ");' – Brice
@Brice - cách thức hoạt động khác với phương pháp của Michael Wiles? –
Nó không phải là. Nó chỉ là một cách khác nhau để đạt được mục đích thử nghiệm. Bởi vì hầu hết thời gian bạn không thực sự cần phải kiểm tra đối số trung gian, nhưng chỉ là một số tương tác đã xảy ra và kết quả cuối cùng.Mặc dù tôi phải nói nếu Tom có yêu cầu cụ thể thì đồng ý điều này sẽ không giúp anh ta, nhưng trong trường hợp này tôi sẽ tránh các đối tượng có thể thay đổi trong mã sản xuất của tôi. Có vẻ như việc nhắn tin giữa hai cộng tác viên và tin nhắn luôn luôn là bất biến. – Brice