Power Mockito WhenNew не работает

Итак, у меня есть класс для тестирования, который имеет конструктор -

public class IdRunnable{
    public IdRunnable(Node root) {
            this.saHandler = new Handler(root);
    }

    public void call(){
    //Somes codes 
    }
}

Я использую платформу Powermock для внедрения фиктивного объекта при вызове нового оператора. Класс тестирования

@RunWith(PowerMockRunner.class)
@PrepareForTest({IdRunnable.class,Handler.class})
public class IdRunnableTest { 
    private IdRunnable runnable;

    @BeforeClass
    public void oneTimeSetUp(){
        Node root = new Node();
        Handler handler = mock(Handler.class);
        whenNew(Handler.class).withArguments(root).thenReturn(handler);
        runnable = new IdRunnable(root);
    }

    @Test(groups = {TestGroup.UNIT_TESTS})
    public void testCall(){
        runnable.call();
    }
}

Когда я запускаю тест, я вижу, что вместо насмешки над новым оператором в конструкторе IdRunnable он продолжает создавать настоящий объект-обработчик. Каким-то образом

whenNew(Handler.class).withArguments(root).thenReturn(handler);

не работает для меня Может кто-нибудь подсказать, что не так с кодом.

Благодарю.

1 ответ

Конечно, это возможно; но такая трата энергии.

Просто делать:

public IdRunnable(Node root) {
   this(new Handler(root);
}

IdRunnable(Handler saHandler) {
   this.saHandler = saHandler;
}

и ваша "необходимость" обратиться к PowerMock просто исчезает. И да, не нужно PowerMock - это хорошо. Потому что теперь вы можете использовать конструктор, который позволяет вам вводить тот объект, который вам нужно смоделировать.

Потому что это означает, что вы предпочитаете писать тестируемый код. По моему опыту:

  1. Иногда Powermock преподносит ужасные сюрпризы (например, тестовые случаи, которые внезапно проваливаются из-за неясных проблем; совсем не связаны с ошибками производственного кода)
  2. Этого можно легко избежать, научившись создавать тестируемый код.

Изменить: с учетом вашего комментария; Ваш единственный выбор - заставить PowerMock(ito) работать на вас. Возможно, этот мой ответ поможет. Он содержит небольшой пример для насмешливых вызовов конструктора; не должно быть большой проблемой, чтобы адаптировать его к вашим потребностям.

Другие вопросы по тегам