Как использовать waitNew для конструктора с универсальным параметром? - PullRequest
0 голосов
/ 02 мая 2018

Мне нужно добавить фиктивный объект в метод, в котором создается новый объект MyClass.

private MyClass<?> c;

public void myMethod(final String s) {

   c = new MyClass<>(s);

   c.callToMock();
}

И у класса, над которым я издеваюсь, есть конструктор с универсальным параметром.

public class MyClass<T> {

   public MyClass(final T t) {
      // do whatever
   }
}

Теперь в моем тесте я создал макет для класса. Когда вызывается new, он должен ввести этот макет.

@RunWith (PowerMockRunner.class)
public class TestClass {

   @SuppressWarnings ("unchecked")
   public void myMethodTest() throws Exception {

      MyClass<String> myMock = (MyClass<String>) EasyMock.createMock(MyClass.class);

      PowerMock.expectNew(MyClass.class, "my argument")
               .andReturn(myMock);
      myMock.callToMock();
      EasyMock.expectLastCall().once();

      EasyMock.replay(myMock);
      PowerMock.replayAll();

      ...

   }

Когда я запускаю тест, он не перехватывает вызов new, а просто создает экземпляр реального объекта MyClass. Я не знаю, может ли он не соответствовать конструктору или как.

Любая помощь будет оценена, спасибо.

1 Ответ

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

Вам нужно добавить @PrepareForTest(MyTestedClass.class) в ваш тестовый класс, чтобы подготовить тестируемый класс к издевательству new.

Вот полностью рабочий тест:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyTestedClass.class)
public class TestClass {

    @Test
    @SuppressWarnings("unchecked")
    public void myMethodTest() throws Exception {

        MyClass<String> myMock = (MyClass<String>) EasyMock.createMock(MyClass.class);
        myMock.callToMock();

        PowerMock.expectNew(MyClass.class, "my argument")
                .andReturn(myMock);

        EasyMock.replay(myMock);
        PowerMock.replayAll();

        MyTestedClass tested = new MyTestedClass();
        tested.myMethod("my argument");
    }
}
...