簡體   English   中英

如何創建虛假數據和數據對象以進行單元測試?

[英]How can I create fake data and the data object for unit testing?

我有一個實現緩存的類,我想為此編寫一個JUnit測試。
該類實現並與以下方法進行接口:

public void insert(Object key, Object value);  
public Object getFromCache(Object key);

基本實現是單例。
我正在編寫一個JUnit測試,但我不知道如何使用數據正確創建一個虛擬緩存以用於測試。
現在我正在做:

@Test
public void myTest() {  
    MyCache cache = MyCache.getInstance();  
    populateWithData(cache);  
    //test cache  
    asserEquals etc  
}  

如何避免使用getInstance()而不在每次測試中填充?

顯然我稍微誤解了您的問題。

正如其他兩個答案所述,如果您想擁有一個特定的緩存,可以在運行每個測試用例時從中讀取內容,則可以使用“ @before”方法,該方法初始化要在測試用例中使用的對象。 在調用每個測試用例之前,將先調用定義的每個“ @before”方法。 這意味着您可以編寫代碼來實例化該對象一次,而不是多次。

請注意 ,如果您想在測試用例中做一些不同的事情,請考慮在自定義項的頂部添加自定義項,而不是對@before方法進行版本@before ,因為這將影響所有測試用例。

為了清楚起見,我將包含一些代碼:

MyCache cache = null;

@before
public void initCache(){
    cache = MyCache.getInstance();  
    populateWithData(cache);  
}

// ... rest of your program here ...

原始答案

如果要對更復雜的對象進行更多的精美測試,則可以使用此方法。 仍可以與“ @before”注釋一起使用

您可以嘗試模仿 ...

基本上,這是一個模擬功能或類的框架,您完全不希望完全實現該功能或類,尤其是對於測試。

這是一個使用模擬列表的示例:

import static org.mockito.Mockito.*;

// mock creation
List mockedList = mock(List.class);

// using mock object - it does not throw any "unexpected interaction" exception
mockedList.add("one");
mockedList.clear();

// selective, explicit, highly readable verification
verify(mockedList).add("one");
verify(mockedList).clear();

// you can mock concrete classes, not only interfaces
LinkedList mockedList = mock(LinkedList.class);

// stubbing appears before the actual execution
when(mockedList.get(0)).thenReturn("first");

// the following prints "first"
System.out.println(mockedList.get(0));

// the following prints "null" because get(999) was not stubbed
System.out.println(mockedList.get(999));

您基本上可以告訴mockito您希望在對象上調用哪些函數,以及預期結果將是什么...非常通用。 我希望它將滿足您的需求。

每次測試前“重置”單身人士。 可以在此處找到更多詳細信息。

例如:

@Before
public void resetMyCacheSingleton() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
   Field instance = MyCache.class.getDeclaredField("instance");
   instance.setAccessible(true);
   instance.set(null, null);
}

您可以使用@BeforeClass批注來做一些普通的事情,並且可能是昂貴的計算工作。

這將在所有測試用例之前只運行一次

@BeforeClass
public static void myTest() {  
    MyCache cache = MyCache.getInstance();  
    populateWithData(cache);  
    //test cache  
    asserEquals etc  
} 

PS由於@BeforeClass只能與靜態方法一起使用,因此populateWithData()也必須是靜態的。 並且由於populateWithData()方法是靜態的,因此其內部使用的變量也必須是靜態的。

您還可以檢查@AfterClass清除/重置一些數據/資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM