EasyMock: макетировать вызов конструктора в Java - PullRequest
7 голосов
/ 04 октября 2011

Я посмотрел похожие вопросы на этой доске, но ни один из них не ответил на мой вопрос. Это звучит странно, но можно ли смоделировать вызов конструктора над объектом, который вы издеваетесь.

Пример:

class RealGuy {

   ....
   public void someMethod(Customer customer) {
     Customer customer = new Customer(145);
   }
}
class MyUnitTest() {
  public Customer customerMock = createMock(Customer.class)
  public void test1() {
    //i can inject the mock object, but it's still calling the constuctor
    realGuyobj.someMethod(customerMock);
    //the constructor call for constructor makes database connections, and such.
  }
}

Как мне ожидать вызова конструктора? Я могу изменить вызов конструктора Customer для использования newInstance, но я не уверен, поможет ли это. Я не контролирую, что делает тело конструктора new Customer(145).

Возможно ли это?

Ответы [ 4 ]

17 голосов
/ 10 мая 2014

Вы можете сделать это с EasyMock 3.0 и выше.

Customer cust = createMockBuilder(Customer.class)
     .withConstructor(int.class)
     .withArgs(145)
     .addMockedMethod("someMethod")
     .createMock();
12 голосов
/ 04 октября 2011

Вы не можете сделать это с easymock, так как он не поддерживает насмешливые конструкторы. Есть библиотека под названием powermock , которая может сделать это, и, насколько я знаю, единственная библиотека-издеватель, которая может блокировать конструкторы и статические методы в Java.

1 голос
/ 25 апреля 2013
import static org.powermock.api.easymock.PowerMock.expectNew;

instance = new UsesNewToInstantiateClass();
expectNew(AnyOldClass.class).andReturn(anyClass);
0 голосов
/ 17 мая 2018

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

Тогда вам НЕ ДОЛЖНО высмеивать их конструкцию.* Это предполагает (а), что это ваш код, который вы можете изменить, и (б) что рассматриваемые объекты достаточно сложны, чтобы их можно было внедрить.Создание простых объектов внутри вашего класса - это хорошо, но тогда вам не нужно их издеваться.

...