2016-05-05 41 views
0

我試圖測試方法findById()方法的類下面,使用CrudRepository從我的數據庫中讀取數據:被測從特定測試值中解耦Mockito測試?

類:

public interface PersonRepository extends CrudRepository<Person, Integer> 
{ 

    Person findById(String id); 
} 

下面是我的測試類,該測試目前正在通過,但我想改變它,以便如果我測試的ID「1」從我的數據庫中刪除,我仍然可以運行我的測試。即不要依賴數據庫中的數據。

我該怎麼做?

測試類:

public class PersonRepositoryTest { 

    @Mock 
    private PersonRepository personRepository; 

    @Before 
    public void setUp() throws Exception { 
     //Initialize the mocked class and ensure that it is not null 
     MockitoAnnotations.initMocks(this); 
     assertThat(personRepository, notNullValue()); 
    } 

    @Test 
    public void testFindById() throws ParseException { 

     //test string 
     String id = "1"; 

     //when it is called, return 
     when(personRepository.findById(anyString())).thenReturn(new Person()); 

     Person person = personRepository.findById(id); 
     assertThat(person, notNullValue()); 
    } 
} 
+1

你描述的其實就是用一個模擬的框架來實現的:你沒有使用真正的數據庫,但確定的答案前期。無論您正在查詢什麼ID,您當前的模擬將始終返回一個新的Person實例。 – Thomas

+0

好的,我應該如何改變我目前的測試? – java123999

+0

目前還不清楚你想實現什麼,你已經獨立於真實的數據庫。那麼你的目標是什麼? – Thomas

回答

0

如由@Thomas郵政評論中提到,你只是嘲諷數據庫。我假設你想在ID爲1時寫一個否定測試用例。

你可以直接返回null而不是Person Object。而不是匹配者,通過一個特定的值來區分你的正面和負面的測試用例。

個案的實證分析 -

when(personRepository.findById(2)).thenReturn(new Person()); 

負案 -

when(personRepository.findById(1)).thenReturn(null); 
+0

但在我的測試中是personRepository不調用數據庫來查找ID「1」? – java123999

+0

不,這就是爲什麼tou引入了一個模擬,使之與真實數據庫無關。 – Thomas

+0

那是什麼模擬是關於正確的?有了模擬,你只是嘲笑與單元測試的數據庫實際交互的行爲。 –