Параметризованное тестирование с Mockito с использованием JUnit @Rule?

Это следует из этот вопрос: где меня просят начать новый вопрос.

Проблема в том, что я просто недостаточно знаю о JUnit Rule или о том, что здесь происходит с Runners и т.п., чтобы решить проблему способом, на который ссылается Джефф Боуман.


person mike rodent    schedule 24.11.2016    source источник
comment
Вы прошли обучение? vogella.com/tutorials/JUnit/article.html также есть раздел для параметризованных тестов   -  person Timothy Truckle    schedule 24.11.2016
comment
@TimothyTruckle Суть моего вопроса в том, что я хочу использовать Mockito, который использует свою собственную аннотацию RunWith, если вы хотите (в частности) вводить макеты. Это проблема. У меня есть основания полагать, что Джефф Боуман может ответить на этот вопрос. Но он хотел, чтобы я начал новый вопрос...   -  person mike rodent    schedule 24.11.2016
comment
@mikerodent Учебник ответит на все ваши вопросы о mockito. Вопрос в том, хотите ли вы чему-то научиться или хотите скопировать решение?   -  person Timothy Truckle    schedule 24.11.2016
comment
@TimothyTruckle хорошо, я посетил ту страницу, которую вы предложили, и искал Mockito ... есть одна ссылка на введение в Mockito. Но я нигде не мог найти, что предлагает, как проводить параметризованное тестирование. На самом деле, по моему опыту, копирование — это отличный способ начать изучение чего-либо. Поэтому, если у вас есть пример, чтобы показать мне, я был бы очень признателен, если бы вы могли ответить на вопрос.   -  person mike rodent    schedule 24.11.2016
comment
Ты становишься довольно раздражающим сейчас. Вы не можете комбинировать две аннотации RunWith. Поэтому невозможно объединить RunWith(MockitoJUnitRunner.class) с RunWith(Parameterized.class). Вы должны думать об этом, а не предполагать, что люди моложе или глупее вас.   -  person mike rodent    schedule 24.11.2016


Ответы (1)


В ваших более поздних комментариях я понял пробел: вам нужно использовать Mockito как правило и Parameterized как бегун, а не наоборот.

Причина в том, что Runner отвечает за отчет о количестве тестов, а Parameterized манипулирует количеством тестов на основе количества тестовых методов и количества параметризованных входных данных, поэтому очень важно, чтобы Parameterized был частью процесса Runner. . Напротив, использование бегуна или правила Mockito заключается в том, чтобы просто инкапсулировать методы @Before и @After, которые инициализируют аннотации Mockito и проверяют использование Mockito, что можно сделать очень легко, поскольку @Rule работает рядом с другими экземплярами @Rule - до точки что MockitoJUnitRunner почти устарел.

Чтобы получить данные непосредственно со страницы документа параметризованного теста JUnit4 и MockitoRule:

@RunWith(Parameterized.class)
public class YourComponentTest {

    @Rule public MockitoRule rule = MockitoJUnit.rule();
    @Mock YourDep mockYourDep;

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {     
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
           });
    }

    private int fInput;

    private int fExpected;

    public YourComponentTest(int input, int expected) {
        fInput = input;
        fExpected = expected;
    }

    @Test
    public void test() {
        // As you may surmise, this is not a very realistic example of Mockito's use.
        when(mockYourDep.calculate(fInput)).thenReturn(fExpected);
        YourComponent yourComponent = new YourComponent(mockYourDep);
        assertEquals(fExpected, yourComponent.compute(fInput));
    }
}
person Jeff Bowman    schedule 24.11.2016
comment
Можно ли также издеваться над данными? то есть @Mock private int fInput ? - person Atieh; 08.01.2018
comment
@Atieh Конечно; Я сделал это выше. Параметризация определяет, сколько раз запускается тест и как создается экземпляр тестового класса, а затем MockitoRule определяет, как @Mock параметры заполняются в каждом тестовом примере (т.е. в каждом экземпляре тестового класса). Пока параметризованный бегун находится в аннотации @RunWith, а инициализация Mockito так или иначе происходит, они отлично работают вместе. - person Jeff Bowman; 09.01.2018