Как смоделировать метод класса, вызываемого внутри другого метода, который тестируется того же класса? - PullRequest
0 голосов
/ 27 июня 2019

Например, есть класс A с двумя методами methodUnderTest () и display (), где methodUnderTest вызывает метод display. Когда я пишу джунит с использованием mockito, как я могу издеваться над методом display ()?

class A{
public int method methodUnderTest{
   //some code
   display();
}

public int display(){
  //some code
}

}

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

Если это ваш класс:

    public static class A{
        public int methodUnderTest() {
            return display();
        }

        public int display(){
            return 1;
        }
    }

затем, используя mockito, вы можете сделать это:

        A a = spy(new A());
        when(a.display()).thenReturn(0);
        System.out.println(a.methodUnderTest()); // will print 0
1006 * * Пояснение:

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

Когда вы spy() в экземпляре, все вызовы записываются, а перенаправляется фактическому экземпляру . Это означает, что поведение вашего класса останется таким же, если вы не будете издеваться над конкретным вызовом.


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

0 голосов
/ 27 июня 2019

Если вы хотите использовать mockito, я бы выбрал что-то вроде этого:

@Mock
private A a;

@Test
public void test() {    

    //define the behaviour
    Mockito.when(a.display()).thenReturn(12);

    // call methodUnderTest
    int res = a.methodUnderTest();

    // check that you get what you want
    Assert.assertEquals(SOME_VALUE, res);

}

А если вы не хотите использовать аннотации, вы бы инициализировали a следующим образом:

A a = Mockito.spy(new A());

HTH!

0 голосов
/ 27 июня 2019

Вам не нужен мокито для этого.В тесте, когда вы создаете свой тестовый объект, вы можете создать его с помощью

A underTest = new A() {
    @Override
    public int display() {
        return <expected result>
    }
}

Таким образом, вы можете контролировать, какое значение возвращается методом отображения.

...