Setzer
Setzer

Reputation: 745

EasyMock: Mock out a constructor call in java

I have a looked at similar questions on this board, but none of them answer my question. This sound strange, but is it possible to mock out a constructor call on the object you're mocking.

Example:

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.
  }
}

How can I expect a constructor call? I can change the Customer constructor call to use newInstance, but im not sure if that will help. I have no control over what the body of the new Customer(145) constructor does.

Is this possible?

Upvotes: 9

Views: 22698

Answers (4)

Charles Roth
Charles Roth

Reputation: 868

And this is why you want to inject your dependencies (via Guice or similar package) instead of creating them inside your class.

Then you don't HAVE TO mock their construction.

This assumes (a) that this is your code that you can change, and (b) that the objects in question are complex enough that you should inject them. Constructing simple objects inside your class are fine, but then you shouldn't need to mock them.

Upvotes: 0

betaboy00
betaboy00

Reputation: 701

you can do so with EasyMock 3.0 and above.

Customer cust = createMockBuilder(Customer.class)
     .withConstructor(int.class)
     .withArgs(145)
     .addMockedMethod("someMethod")
     .createMock();

Upvotes: 20

Truong Ha
Truong Ha

Reputation: 10964

import static org.powermock.api.easymock.PowerMock.expectNew;

instance = new UsesNewToInstantiateClass();
expectNew(AnyOldClass.class).andReturn(anyClass);

Upvotes: 1

Augusto
Augusto

Reputation: 30052

You can't do this with easymock, as it doesn't support mocking constructors. There's a library called powermock which can do that and is the only mocking library, as far as I know, that can stub constructors and static methods in Java.

Upvotes: 12

Related Questions