Метод Junit Mocking / Stubbing B внутри метода A (непараметрический метод A) - PullRequest
0 голосов
/ 01 октября 2018

Я столкнулся со сценарием, в котором я не могу смоделировать / заглушить метод.

Class A{
   B b = new B();
   method aa(){
   ... call to method bb in class B
 }
}
Class B{
   method bb(){
     ......
   }
}

Я хочу смоделировать метод bb для класса B. Поскольку метод aa класса A не имеет конструкторагде b передается, я не уверен, как я могу смоделировать его поведение.

Я пытался смоделировать B

A a = new A();
B b_mock = Mockito.mock(B.class);
when(b_mock.bb).thenReturn(..something);
a.aa();

Но при тестировании метода aa он все еще идет в методе bb, что имеет смыслпоскольку нет никакой связи между A и b_mock.Я не уверен, как установить соединение между A и B.

Я пробовал @InjectMock, который также не работает, и я пытаюсь избежать powerMock.Я не уверен, достижимо ли это.

Заранее спасибо!

1 Ответ

0 голосов
/ 01 октября 2018

A тесно связан с B, что затрудняет модульное тестирование A в изоляции.

Если вы можете выполнить рефакторинг A, чтобы следовать явному принципу зависимости через внедрение конструктора

public class A{
    private B b;
    public A(B b) {
        this.b = b;
    }

    public void aa(){
        //... call to method bb in class B
    }
}

Вы сможете ввести макет при тестировании

//Arrange
B b_mock = Mockito.mock(B.class);
A a = new A(b_mock);
when(b_mock.bb).thenReturn(..something);

//Act
a.aa();

//...

, в противном случае вам потребуется использовать PowerMock для имитации инициализации B, что, к сожалению, возможно, однакопоощряет плохой дизайн с жесткой связью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...