繁体   English   中英

使用Powermockito在junit中模拟私有方法

[英]Mocking a private method in junit using Powermockito

我需要模拟以下方法调用carBookBuilder.setTrip(protoConverter.convertTrip(carBookRequest, location)) ,但是当carBookBuilder.setTrip(protoConverter.convertTrip(carBookRequest, location))调用时,我应该只返回模拟tripdetails并跳过protoConverter.convertTrip(carBookRequest, location)方法调用。

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

我在这里看到几个问题。 如果我对您的理解正确,那么您正在尝试测试ProtoRequestAdapter#populateCarBook

首先,您应该使方法公开或至少受保护,否则您的单元测试将无法调用它。

接下来,您要模拟的方法是ProtoConverter#convertTrip ,它不是私有的,否则您的代码将无法编译。 更麻烦的是,您直接在代码中实例化了它,这使得用模拟代替它成为不可能。

我强烈建议您将其注入到您的类中(或至少将实例化移动到(受保护的) getProtoConverter()方法中,该方法可以在测试中覆盖)。

您必须在测试类中实例化tripDetails

TripDetails tripDetails = new TripDetails();
tripDetails.setLocation = "London";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM