Можно ли провести модульное тестирование метода, в котором есть сеттер и геттер, используя mockito и powermock - PullRequest
0 голосов
/ 10 мая 2018

Я пишу модульный тест для унаследованного кода, который в основном устанавливает и получает значение в методе с использованием цепочки-заглушки, класс, который я тестирую, не зависит от других классов, поэтому у меня нет ничего ложного, но есть такой метод, как это

public class SampleClass {
  public void process(Context context){
    context.getState().setValue(MathUtil.roundToThree(context.getState().getValue());
  }
}

Тестовый класс, который я написал, выглядит следующим образом:

@RunWith(MockitoJUnitRunner.class)
public class TestSampleClass{
 SampleClass sample = new SampleClass();
 @Test
 public void testProcess(){
 Context context = Mockito.mock(Context.class, Mockito.RETURNS_DEEP_STUBS);
 Mockito.when(context.getState().getValue()).thenReturn(4.12345);
 sample.process(context);
 assertEquals(4.123,context.getState().getValue(),0.0);
 }
}

Тестовый пример не пройден, поскольку он возвращает 4.12345 из-за Mockito.when (), но я не уверен, как проверить значение в context объекте после вызова метода process().

Я не могу изменить исходный код. Инициализация контекста очень сложна, потому что она зависит от многих других классов. Пожалуйста помоги.

1 Ответ

0 голосов
/ 10 мая 2018

Проблема в том, что ваш объект заглушки State не знает, что значение, возвращаемое getValue(), должно быть последним значением, которое было передано setValue().

Заглушка, созданная Mockito, нене принимайте автоматически, что у вас есть получатель и установщик, и получатель должен вернуть то, с чем вызывался последний раз.Это просто тупая заглушка, которая делает только то, что вы сказали, и вы не сказали ей ничего делать, когда вызывается setValue().

Возможно, проще всего проверить, что setValueбыл вызван с округленным значением, а не попыткой извлечь его из getValue():

    Mockito.verify(context.getState()).setValue(AdditionalMatchers.eq(4.123, 0.0));

Другой подход заключается в создании тестового класса State, который имеет реальные методы получения и установки, и использовать его в своемтесты.Конечно, можете ли вы сделать это, зависит от того, сколько других методов у этого класса.Если бы вы написали такой класс (я назвал его TestState в приведенном ниже коде), тестовый код выглядел бы следующим образом:

@Test
public void testProcess2(){
    Context context = Mockito.mock(Context.class);
    Mockito.when(context.getState()).thenReturn(new TestState());
    context.getState().setValue(4.12345);
    sample.process(context);
    assertEquals(4.123,context.getState().getValue(),0.0);
}
...