Можно ли создать вложенный модульный тест, используя junit и mockito? - PullRequest
1 голос
/ 08 сентября 2011

Например:

@RunWith(MockitoJUnitRunner.class)
public class ClientFormServiceTest {
    @Mock
    ClientFormService clientFormService;

    public class GetNewClientFormTest {
    @Mock
    protected ClientForm result;

    @Before
    public void given() {
        result = clientFormService.getNewForm();
    }

    @Test
    public void should_do_something() {
    }
}

public class CreateClientFormTest {
    @Mock
    protected ClientForm clientForm;

    @Before
    public void given() {
        clientFormService.createForm(clientForm);
    }

    @Test
    public void should_do_something() {
    }
}

}

Это то, что я хочу сделать, но я не могу запустить модульные тесты, если они вложены в класс.

Ответы [ 2 ]

5 голосов
/ 14 августа 2013

Я являюсь автором JUnit TestRunner, вложенного в junit, который, я думаю, может делать то, что вы хотите: https://github.com/avh4/junit-nested

Однако из вашего примера непонятно, зачем вам нужны вложенные тесты. Типичная причина их использования - поделиться поведением при настройке, но вам следует подумать о том, более ли уместно иметь отдельные тестовые классы.

В любом случае, вот как вы можете это сделать с вложенной в junit: (Поскольку Nested - это тестовый прогон, вам придется использовать MockitoAnnotations.initMocks() вместо тестового прогона Mockito.)

import net.avh4.test.junit.Nested;

@RunWith(Nested.class)
public class ClientFormServiceTest {
    @Mock
    ClientFormService clientFormService;

    @Before
    public void given() {
        MockitoAnnotations.initMocks(this);
    }

    public class GetNewClientFormTest {
        @Mock
        protected ClientForm result;

        @Before
        public void given() {
            MockitoAnnotations.initMocks(this);
            result = clientFormService.getNewForm();
        }

        @Test
        public void should_do_something() {
        }
    }    

    public class CreateClientFormTest {
        @Mock
        protected ClientForm clientForm;

        @Before
        public void given() {
            MockitoAnnotations.initMocks(this);
            clientFormService.createForm(clientForm);
        }

        @Test
        public void should_do_something() {
        }
    }
}
1 голос
/ 20 сентября 2011

Почему вы хотите это сделать?Если вы хотите извлечь выгоду из повторного использования кода во многих похожих тестах, вы можете создать базовый класс тестирования с общим кодом и заставить его расширять классы тестирования.

...