簡體   English   中英

當我們使用 Spring 自動連接 DAO 時,如何在單元測試中模擬出各種結果集?

[英]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.

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