2016-11-03 3 views
0

Я пишу тестовый класс, используя JUnitParams и Mockito. Я хочу использовать Mockito mock как parameter. В моем тесте у меня около десяти макетов, и я хочу передать только один макет, чтобы определить для него особое поведение.Почему переменные поля null после установки их в методе JUnitParams?

Я воспроизвел проблему на простом примере.

Моей проблема: я инициализировать переменную myList в методе parametersForTest, но когда я отладка в метод testmyList имеет нулевое значение, но param мой нужный макет.

@RunWith(JUnitParamsRunner.class) 
public class MockitoJUnitParamsTest { 

    private List myList; 

    @Test 
    @Parameters 
    public void test(List param) { 
     assertThat(param).isEqualTo(this.myList); 
    } 

    public Object[] parametersForTest() { 
     myList = Mockito.mock(List.class); 
     return new Object[]{myList}; 
    } 
} 

Я использую

  • JUnitParams версия 1.0.5
  • JUnit версия 4,12
  • Mockito версия 1.10.19

Почему MyList нуль и как можно исправить ?

ответ

3

Экземпляр класса MockitoJUnitParamsTest с параметрами forTest() - это не то же самое, что и test(). Это связано с тем, что Junit создаст другой экземпляр для каждого метода тестирования. В вашем случае, делая MyList статического

private static List myList; 

может решить эту проблему частично, но может потерпеть неудачу, если тесты работают параллельно.

2

Рамки и бегуны JUnit часто создают отдельные экземпляры тестового класса для каждого вызова метода. Похоже, что это то, что делает JUnitParams - вы можете видеть, что с помощью следующего теста:

@RunWith(JUnitParamsRunner.class) 
public class JUnitParamsTest { 

    @Test 
    @Parameters 
    public void test(JUnitParamsTest param) { 
     Assert.assertNotNull(param); 
     Assert.assertNotSame(this, param); 
    } 

    Object[] parametersForTest() { 
     return new Object[]{this}; 
    } 

} 

Таким образом, проблема с вашим примером выше, что myList поля будучи установленным parametersForTest является членом другого объекта из одного это test(List) вызываем.

Как исправить

Ну, я думаю, ключевой вопрос в том, что вы пытаетесь достичь здесь? Целый пункт JUnitParams - это то, что параметры вводятся в методы тестирования, поэтому вам не нужно использовать поля. Мне кажется, что изменение значений полей внутри метода parametersForTest() вне предполагаемого использования, и я не могу понять, почему вы хотите это сделать.

Одним быстрым и грязным решением было бы сделать статический ток myList, который должен работать до тех пор, пока ваш тестовый класс не будет доступен несколькими потоками одновременно (некоторые среды с единичным тестированием работают многопоточно, поэтому существует риск здесь).

Лучшим решением было бы перепроектировать ваши тесты, чтобы вы не изменяли поля из методов создания параметров. Пример, который вы указали, похоже, не пытается проверить что-либо, кроме самого JUnitParams, поэтому я не могу помочь вам определить, какой будет хороший дизайн, поскольку я не знаю, чего вы пытаетесь достичь. Вы хотите сказать, что вы хотите, чтобы несколько методов тестирования до делили один моккитовый макет? Если да, то почему? Я не уверен, что Мокито поддержал бы это (я не пробовал).Единичные тесты, как правило, должны быть изолированы друг от друга, поэтому рекомендуемое действие будет заключаться в создании нового макета каждый раз.