PowerMockito.whenNew работает со ссылкой, не работает с объектом - PullRequest
0 голосов
/ 18 октября 2018

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

public class A {

  public void test(){
    Map<String,String> map = new HashMap<String, String>();
    Map<String,String> map1 = new HashMap<String, String>();
    System.out.println(map);
    System.out.println(map1);
  }
}

Первый способ написания Test, который работает, как и ожидалось

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class ATest {

    @Test
    public void test() throws  Exception{
        HashMap<String,String> map = PowerMockito.mock(HashMap.class);
        HashMap<String,String> hashMap = new HashMap<String, String>();
        PowerMockito.whenNew(HashMap.class).withNoArguments().thenReturn(map,hashMap);
        A a = new A();
        a.test();
    }


}

Второй способ, где я непосредственно передал новый HashMap (), что вызывает исключение,

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class ATest {

    @Test
    public void test() throws  Exception{
        HashMap<String,String> map = PowerMockito.mock(HashMap.class);
        PowerMockito.whenNew(HashMap.class).withNoArguments().thenReturn(map,new HashMap<String,String>());
        A a = new A();
        a.test();
    }


}

может любойпожалуйста, дайте мне знать, почему он не работает, когда я передаю HashMap напрямую .....?

1 Ответ

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

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

PowerMockito.whenNew(HashMap.class).withNoArguments().thenReturn(map,new HashMap<String,String>());

Сначала выполняется вызов whenNew().Это заставляет Mockito перехватывать все последующие вызовы на HashMap::new.Однако вы еще не сказали, что возвращать (часть thenReturn() еще не запущена), поэтому теперь нельзя вызывать конструктор HashMap.Если вы это сделаете, вы столкнетесь с исключением.

Давайте теперь посмотрим на часть thenReturn().После его завершения вы можете безопасно вызвать HashMap::new еще раз - Mockito будет знать, что вернуть.Но прежде чем thenReturn() будет вызван, все его аргументы должны быть разрешены.Это приводит к тому, что конструктор HashMap вызывается слишком рано - отсюда и исключение.Когда он вызывается, вы оставили Mockito в недопустимом промежуточном состоянии в отношении HashMap::new.Таким образом, он выдает исключение.

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

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