2012-08-03 40 views
39

Tôi đang sử dụng Mockito 1.9.0. Làm thế nào tôi sẽ xác minh rằng một phương pháp đã được gọi chính xác một lần, và rằng một trong những lĩnh vực thông qua để nó có chứa một giá trị nhất định? Trong thử nghiệm JUnit của tôi, tôi cóSử dụng Mockito, làm cách nào để xác minh một phương thức được gọi với một đối số nhất định?

@Before 
public void setupMainProg() { 
    // Initialize m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc 
    ... 
    m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc); 
} // setupMainProg 

@Test 
public void testItAll() throws GeneralSecurityException, IOException { 
    m_prog.work(); 
} 

Phương thức "công việc" gọi phương thức "m_orderSvc" (một trong các đối số được truyền vào đối tượng). "m_orderSvc," lần lượt chứa một trường thành viên, "m_contractsDao". Tôi muốn xác minh rằng "m_contractsDao.save" đã được gọi chính xác một lần và đối số được truyền cho nó chứa một giá trị nhất định.

Điều này có thể hơi khó hiểu. Hãy cho tôi biết làm thế nào tôi có thể làm rõ câu hỏi của tôi và tôi rất vui khi làm điều đó.

Trả lời

48

Trước tiên, bạn cần tạo một m_contractsDao và cài đặt. Giả sử rằng lớp học là ContractsDao:

ContractsDao mock_contractsDao = mock(ContractsDao.class); 
when(mock_contractsDao.save(any(String.class))).thenReturn("Some result"); 

Sau đó, tiêm mô phỏng vào m_orderSvc và gọi phương thức của bạn.

m_orderSvc.m_contractsDao = mock_contractsDao; 
m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc); 
m_prog.work(); 

Cuối cùng, xác minh rằng các mô hình được gọi là đúng:

verify(mock_contractsDao, times(1)).save("Parameter I'm expecting"); 
+9

FYI, bạn có thể rời khỏi ', lần (1)', vì nó luôn luôn ám chỉ trừ khi bạn thêm một lượng hóa quy định cụ thể một cái gì đó khác hơn là chính xác một lần. Và thay vì 'any (String.class)', có một 'anyString()' thuận tiện hơn một chút. –

+3

Cũng cần lưu ý rằng đối số được chuyển cho phương thức SAU khi 'xác minh' được so sánh bằng cách sử dụng' bằng' cho đối số đã được chuyển qua trong thử nghiệm thực tế. Vì vậy, bất kể phương thức là gì (phương thức 'save' trong ví dụ của mamboking), hãy suy nghĩ về _type_ của mỗi tham số, và liệu so sánh với' bằng' là cái bạn thực sự muốn. Nếu bạn muốn đối số được kiểm tra với một cái gì đó khác với 'bằng', bạn sẽ cần một' ArgumentMatcher' của một kiểu nào đó (có thể là một 'ArgumentCaptor' như trong câu trả lời của Kevin Welker). –

+0

Làm thế nào để bạn xác định chính xác một lần, không phải là hai hoặc nhiều hơn? @ Bình luận của KevinWelker nói rằng nó ngầm, nhưng không chắc chắn nếu nó có nghĩa là chính xác một lần, hoặc ít nhất một lần. – aliteralmind

21

Building tắt của câu trả lời Mamboking của:

ContractsDao mock_contractsDao = mock(ContractsDao.class); 
when(mock_contractsDao.save(anyString())).thenReturn("Some result"); 

m_orderSvc.m_contractsDao = mock_contractsDao; 
m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc); 
m_prog.work(); 

Phát biểu yêu cầu của bạn để xác minh xem đối số chứa một số giá trị, tôi có thể giả sử bạn có nghĩa là đối số là một String và bạn muốn kiểm tra xem đối số String có chứa một chuỗi con hay không. Đối với điều này bạn có thể làm:

ArgumentCaptor<String> savedCaptor = ArgumentCaptor.forClass(String.class); 
verify(mock_contractsDao).save(savedCaptor.capture()); 
assertTrue(savedCaptor.getValue().contains("substring I want to find"); 

Nếu giả định đó là sai lầm, và lập luận để save() là một bộ sưu tập của một số loại, nó sẽ là chỉ hơi khác nhau:

ArgumentCaptor<Collection<MyType>> savedCaptor = ArgumentCaptor.forClass(Collection.class); 
verify(mock_contractsDao).save(savedCaptor.capture()); 
assertTrue(savedCaptor.getValue().contains(someMyTypeElementToFindInCollection); 

Bạn cũng có thể kiểm tra vào ArgumentMatchers, nếu bạn biết cách sử dụng khớp nối Hamcrest.

7

Đây là giải pháp tốt hơn:

verify(mock_contractsDao, times(1)).save(Mockito.eq("Parameter I'm expecting")); 
+0

Điều này là tốt hơn khi bạn đang xử lý các kiểu không nguyên thủy. – pisaruk

Các vấn đề liên quan