繁体   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