Как я могу смоделировать различные наборы результатов в моих модульных тестах, когда мы используем Spring для автоматического подключения DAO? - PullRequest
1 голос
/ 07 июля 2011

Допустим, у меня есть менеджер, который выглядит примерно так:

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's AbstractDependencyInjectionSpringContextTests для того, чтобы использовать тестовые контексты. Таким образом, получение фиктивного DAO из конфигурации тестового контекста, и автоматическое подключение это не проблема. Однако это означает, что для каждого теста, в котором требуется тестирование другого набора результатов, мне понадобится другая контекстная конфигурация и разные фиктивные DAO. Прямо сейчас вы можете видеть, что у меня только один тестовый конфиг для моего фиктивного DAO. Каков наилучший способ справиться с этим?

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Не позволяйте 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...
    }
}
0 голосов
/ 08 июля 2011

Создайте объекты 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...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...