当前位置: 首页 > 工具软件 > Spock Proxy > 使用案例 >

Spock单元测试-mock static方法(普通类中的static方法)

雍马鲁
2023-12-01

groovy单元测试,mock静态方法,需要使用PowerMockito。还会影响其他普通方法的mock。
例如下面的代码:
1.OrderInfoServiceProxy.getOrderInfo为静态方法。
2.orderActionServiceProxy.updateOrderData为普通public方法,但是该类有static公共变量。
但是如果用spock+PowerMockito,mock掉上面第一条。第二条也需要在PrepareForTest注解上加上该类

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([OrderInfoServiceProxy.class, OrderActionServiceProxy.class])
@SuppressStaticInitializationFor(["com.ctrip.tourtailor.vendorform.service.biz.proxy.OrderInfoServiceProxy", "com.ctrip.tourtailor.vendorform.service.biz.proxy.OrderActionServiceProxy"])
class OrderServiceTimeCoreSpockTest extends Specification {
    def orderServiceTimeCore = new OrderServiceTimeCore()
    def orderActionServiceProxy = Mock(OrderActionServiceProxy)
    void setup() {
        //调用该类的普通方法,但是有static公共变量,所以需要在PrepareForTest注解上加上该类
        orderServiceTimeCore.orderActionServiceProxy = orderActionServiceProxy
        //调用该类的static方法
        PowerMockito.mockStatic(OrderInfoServiceProxy.class)
    }

    def "Update4126ClientConfirmTime"() {
        given: "OOrder"
        //查询订单
        Calendar calendar = Calendar.getInstance()
        calendar.add(Calendar.DATE, -1)
        //静态方法
        PowerMockito.when(OrderInfoServiceProxy.getOrderInfo(1L, true)).thenReturn(new OrderInfoDTO(orderId: 1L, orderDate: calendar))
        PowerMockito.when(OrderInfoServiceProxy.getOrderInfo(2L, true)).thenReturn(null)
        //普通方法
        orderActionServiceProxy.updateOrderData(_, _, _) >> _
        expect:
        orderServiceTimeCore.update4126ClientConfirmTime(orderId, date);
        where:
        orderId | date       || _
        1       | new Date() || _
        2       | new Date() || _
        1       | null       || _

    }

普通方法测试对比。
orderActionServiceProxy.updateOrderData为普通public方法,但是该类有static公共变量。却不用加PrepareForTest注解。
代码如下:

class OrderFirstCallTimeServiceImplSpockTest extends Specification {
    def orderFirstCallTimeService = new OrderFirstCallTimeServiceImpl()
    def orderActionServiceProxy = Mock(OrderActionServiceProxy)
    def orderService = Mock(OrderService)

    void setup() {
        orderFirstCallTimeService.orderActionServiceProxy = orderActionServiceProxy
        orderFirstCallTimeService.orderService = orderService
    }

    def "Update4126ClientConfirmTime"() {
        given: "OOrder"
        //查询订单
        Calendar calendar = Calendar.getInstance()
        calendar.add(Calendar.DATE, -1)
        java.sql.Timestamp createDate = new java.sql.Timestamp(calendar.getTime().getTime())
        orderService.getOrder(1L) >> new OOrder(orderId: 1L, datachangeCreatetime: createDate)
        orderService.getOrder(2L) >> null
        orderActionServiceProxy.updateOrderData(_, _, _) >> _
        expect:
        orderFirstCallTimeService.update4126ClientConfirmTime(orderId, date);
        where:
        orderId | date       || _
        1       | new Date() || _
        2       | new Date() || _
        1       | null       || _

    }

}
 类似资料: