Как макетировать классы с помощью конструктора - PullRequest
0 голосов
/ 23 мая 2018

Как получить инъекцию конструктора в Mockito

У меня есть следующий класс:

class A{

  private B mB;

  A(B b){
     mB = b;
  }

 void String someMethod(){
     mB.execute();
  }
}

Как мне проверить someMethod, используя фиктивный класс A и класс Bиспользуя

B b = Mockito.mock(B.class)
Mockito.when(b.execute().thenReturn("String")

A a = Mockito.mock(A.class)
//somehow inject b into A and make the below statement run
Mockito.when(a.someMethod()).check(equals("String"))

Ответы [ 4 ]

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

Еще один способ введения макета в реальный объект (так как А должен быть реальным объектом) - использовать аннотации, они будут создавать нужные вам объекты:

@Mock 
B mockOfB;

@InjectMocks
A realObjectA;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

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

Поведение объекта B может быть смоделировано любым способом, чтобы удовлетворитьваши потребности.

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

Вы хотите проверить someMethod() класса A.Тестирование execute() класса B должно проводиться в другом тесте, потому что экземпляр B является зависимостью в вашем случае.Тест на execute() должен быть выполнен в другом тесте.

Вам не нужно проверять, как будет вести себя объект B, поэтому вам нужно смоделировать его, а затем проверить, был ли вызван execute().

Итак, в вашем случае ваш тест будет выглядеть примерно так:

  B b = Mockito.mock(B.class);
  A a = new A( b );
  a.someMethod();
  Mockito.verify( b, Mockito.times( 1 ) ).execute();
0 голосов
/ 23 мая 2018

Вам нужно создать настоящий класс А, потому что вы хотите проверить его, но вам нужно смоделировать другие классы, используемые в классе А.Также вы можете найти mockito документация , в которой написано, что не надо издеваться над всем.

class ATest {
        @Mock
        private B b;
        private A a;
        @Before
        public void init() {
            MockitoAnnotations.initMocks(this);
            a = new A(b);
        }
        @Test
        public String someMethodTest() {
            String result = "result";
            Mockito.when(b.execute()).thenReturn(result);
            String response = a.someMethod();
            Mockito.verify(b,  Mockito.atLeastOnce()).execute();
            assertEquals(response, result);
        }
    }
0 голосов
/ 23 мая 2018

По моему мнению, вы смешиваете два способа тестирования.

Если вы хотите написать тест с использованием Mockito, вы просто создаете макет некоторого класса и используете его.Этот макет не имеет ничего общего с реальным объектом, так как вы можете (должны) насмехаться над каждым методом, вызываемым в тесте.Вот почему нет смысла издеваться над классом B - он просто не используется классом A.

В противном случае, если вы хотите проверить реальное поведение класса A, тогда почемуты хочешь высмеять это?Создайте реальный экземпляр класса A с макетом экземпляра класса B.

Вот и все!Не перепутайте.

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