[英]How can I mock out various result sets in my unit tests when we're using Spring to autowire the DAO?
假設我有一個看起來像這樣的經理:
public class CustomerManager {
@Autowired
@Qualifier("customerDAO")
private CustomerDAO customerDAO;
public List<Customer> findCustomers() {
List<Customer> customers = customerDAO.findCustomers();
if (customers.size() == 0) {
// Do something else...
}
if (customers.size() == 1) {
// Do something else...
}
return customers;
}
}
現在是如何配置我的測試的示例:
public class CustomerManagerUnitTest extends AbstractDependencyInjectionSpringContextTests {
protected String[] getConfigLocations() {
return new String[] { "classpath:test-spring-customer.xml" };
}
public void testFindCustomers_NoResults() {
CustomerManager customerManager = new CustomerManager();
List<Customer> customers = customerManager.findCustomers();
// Test...
}
public void testFindCustomers_OneResult() {
CustomerManager customerManager = new CustomerManager();
List<Customer> customers = customerManager.findCustomers();
// Test...
}
public void testFindCustomers_MultipleResults() {
CustomerManager customerManager = new CustomerManager();
List<Customer> customers = customerManager.findCustomers();
// Test...
}
}
根據客戶的數量(或客戶數據的類型),我需要做一些具體的事情。 我正在使用 Spring 的 AbstractDependencyInjectionSpringContextTests 來使用測試上下文。 因此,從測試上下文配置中獲取模擬 DAO,並自動裝配它是沒有問題的。 但是,這意味着對於需要測試不同結果集的每個測試,我需要有不同的上下文配置和不同的模擬 DAO。 現在你可以看到我的模擬 DAO 只有一個測試配置。 處理這個問題的最佳方法是什么?
不要讓 Spring 創建您的 CustomerManager 進行測試。 手動創建它並手動注入一個模擬 DAO。 這就是依賴注入的重點:
public class CustomerManager {
private CustomerDAO customerDAO;
@Autowired
public CustomerManager(@Qualifier("customerDAO") CustomerDAO customerDAO) {
this.customerDAO = customerDAO;
}
}
public class CustomerManagerUnitTest {
public void testFindCustomers_OneResult() {
CustomerDAO mockCustomerDAO = ...;
CustomerManager customerManager = new CustomerManager(mockCustomerDAO);
expect(customerDAO.findCustomers()).andReturn(...);
// ...
List<Customer> customers = customerManager.findCustomers();
// Test...
}
}
自己創建 CustomerManager 對象,提供(模擬)DAO。 您可以為每個測試使用不同的 DAO 模擬(使用 Mockito):
class CustomerManagerTest {
public void testWithNoCustomers() {
List<Customer> emptyCustomerList = ...;
CustomerDAO mockCustomerDAO = mock(CustomerDAO.class);
when(mockCustomerDAO.findCustomers()).thenReturn(emptyCustomerList);
CustomerManager customerManager = new CustomerManager(mockCustomerDAO);
// Testing expecting result for no customers case...
}
public void testWithOneCustomer() {
List<Customer> customerListWithOne = ...;
CustomerDAO mockCustomerDAO = mock(CustomerDAO.class);
when(mockCustomerDAO.findCustomers()).thenReturn(customerListWithOne);
CustomerManager customerManager = new CustomerManager(mockCustomerDAO);
// Testing expecting result for one customer case...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.