1

I need to mock following method call carBookBuilder.setTrip(protoConverter.convertTrip(carBookRequest, location)), But When carBookBuilder.setTrip(protoConverter.convertTrip(carBookRequest, location)) is calling i should just return mocking tripdetails and skip protoConverter.convertTrip(carBookRequest, location) method call.

ProtoRequestAdapterTest.java

@RunWith(PowerMockRunner.class)
@PrepareForTest({ProtoRequestAdapter})
class ProtoRequestAdapterTest {

    @Test
    public void testPopulateCarBookTest() {
        CarApiToProtoConverter carApiToProtoConverter;
        carApiToProtoConverter =  PowerMockito.mock(CarApiToProtoConverter.class);
        PowerMockito.when(carApiToProtoConverter.convertTripDetails(carBookRequest, locale)).thenReturn(tripDetails);
    }
}

ProtoRequestAdapter.java

class ProtoRequestAdapter {
     private CarBookRequest populateCarBook(BookingRequest bookingRequest) {
        CarBookRequest newCarBookReq = bookingRequest.getCarBookRequest();
        CarBookRequest.Builder carBookBuilder = CarBookRequest.newBuilder();

        ProtoConverter protoConverter =
                new ProtoConverter(refData, location);
        carBookBuilder.setTrip(protoConverter.convertTrip(carBookRequest, location));
        return carBookBuilder;
    }
}
nathanchere
  • 8,008
  • 15
  • 65
  • 86
minu roy
  • 13
  • 3
  • possible duplicate of [How to mock private method for testing using PowerMock?](http://stackoverflow.com/questions/7803944/how-to-mock-private-method-for-testing-using-powermock) – Roman Vottner Jul 15 '15 at 08:12
  • I tried this one , but it won't work properly PowerMockito.when(spy, method(ProtoConverter.class, "convertTripDetails", CarBookRequest.class, Location.class)) .withArguments(anyObject(), anyObject()) .thenReturn(tripDetails); – minu roy Jul 15 '15 at 11:57
  • On trying this am getting error as argument type mismatch – minu roy Jul 16 '15 at 03:45

2 Answers2

1

I see several problems here. If I understand you correctly, you are trying to test ProtoRequestAdapter#populateCarBook.

First of all you should make the method public or at least protected, as otherwise your unit test can not call it.

Next the method you are trying to mock is ProtoConverter#convertTrip, which is not private, as otherwise your code would not compile. More problematic is that you are instantiating it directly in your code, which makes it impossible to replace it with a mock.

I would strongly suggest you to inject it into your class (or at least move the instantiation into a (protected) getProtoConverter()-method, which you can overwrite in your test).

Seb
  • 1,721
  • 1
  • 17
  • 30
  • I would like to mock ProtoConverter#convertTrip which is a public method – minu roy Jul 15 '15 at 12:00
  • If it is a public method, you do not need powermockito at all. Just use Mockito.mock(ProtoConverter.class) and user Mockito.when(protoConverterMock.convertTrip(Mockito.any(CarBookRequest.class, Mockito.any(Location.class)).thenReturn(yourObject) or something like that. The main difficulty here is get your mocked object into your class under test. That is why I suggested to make it settable from outside. Theoretical you CAN intercept the constructor call with powermockito (although I never used this myself), but I wouldnt recommend it. – Seb Jul 15 '15 at 12:14
0

You have to instantiate tripDetails in your test class.

TripDetails tripDetails = new TripDetails();
tripDetails.setLocation = "London";
Wavemaster
  • 1,794
  • 16
  • 27