Mockito 是一個基於MIT協議的開源java測試框架。
Mockito區別於其餘模擬框架的地方主要是容許開發者在沒有創建「預期」時驗證被測系統的行爲。
對於mock對象的一個評價是測試系統的測試代碼是一個高耦合的,因爲 Mockito試圖經過移除「指望規範」去除expect-run-verify(指望驗證模式)的模式,
所以在耦合度上有所下降。這樣的結果是簡化了測試代碼,使他更易讀和修改了。java
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.8.5</version> <scope>test</scope> </dependency>
public class Person { private final Integer personID; private final String personName; public Person( Integer personID, String personName ) { this.personID = personID; this.personName = personName; } public Integer getPersonID() { return personID; } public String getPersonName() { return personName; } }
public interface PersonDao { public Person fetchPerson( Integer personID ); public void update( Person person ); }
public class PersonService { private final PersonDao personDao; public PersonService( PersonDao personDao ) { this.personDao = personDao; } public boolean update( Integer personId, String name ) { Person person = personDao.fetchPerson( personId ); if( person != null ) { Person updatedPerson = new Person( person.getPersonID(), name ); personDao.update( updatedPerson ); return true; } else { return false; } } }
--添加單元測試類apache
public class PersonServiceTest { @Mock private PersonDao personDAO; private PersonService personService; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks( this ); personService = new PersonService( personDAO ); } @Test public void shouldUpdatePersonName() { Person person = new Person( 1, "Phillip" ); when( personDAO.fetchPerson( 1 ) ).thenReturn( person ); boolean updated = personService.update( 1, "David" ); assertTrue( updated ); verify( personDAO ).fetchPerson( 1 ); ArgumentCaptor<Person> personCaptor = ArgumentCaptor.forClass( Person.class ); verify( personDAO ).update( personCaptor.capture() ); Person updatedPerson = personCaptor.getValue(); assertEquals( "David", updatedPerson.getPersonName() ); // asserts that during the test, there are no other calls to the mock object. verifyNoMoreInteractions( personDAO ); } @Test public void shouldNotUpdateIfPersonNotFound() { when( personDAO.fetchPerson( 1 ) ).thenReturn( null ); boolean updated = personService.update( 1, "David" ); assertFalse( updated ); verify( personDAO ).fetchPerson( 1 ); verifyZeroInteractions( personDAO ); verifyNoMoreInteractions( personDAO ); } }
項目當中使用的另外一種寫法以下:框架
ApacheHttpClientService apacheHttpClientService = Mockito.mock(ApacheHttpClientService.class); ReflectionTestUtils.setField(wsDomainConfService, "apacheHttpClientService", apacheHttpClientService); ApacheHttpClientResult result = new ApacheHttpClientResult(); int statusCode = 200; result.setStatusCode(statusCode); result.setResponseContent(responseContent); // 獲取廠商鑑權1 Mockito.when(apacheHttpClientService.getForObject(Mockito.any(String.class), Mockito.any(Map.class))) .thenReturn(result);