填充Spock中的Stub void方法

时间:2015-11-06 05:42:51

标签: java unit-testing spock

如何存根/模拟填充某些将在以后使用的对象的void方法。

class RequestHelper{
public void populateOrderRequestBody(String product,String quantity,String profile, OrderType orderType){
    orderType.setProduct(product);
    orderType.setQuantity(Integer.parseInt(quantity));
    orderType.setUser(profile.getUserId());
} }

class ServiceClient{
RequestHelper rh;

public void docall(Order order){
    OrderType  orderType = FACTORY.CreateOrderType;
    rh.populateOrderRequestBody(order.getProduct(),order.getQuantity(),order.getProfile(),orderType);
    /**
    * some other code
    **/
}

public setRequestHelper(RequestHelper rh){
    this.rh=rh;
}
public RequestHelper getRequestHelper(){
    return this.rh;
}}

现在我想测试ServiceClient类,它调用RequestHelper来填充orderType对象。如何存根RequestHelper类的方法。

2 个答案:

答案 0 :(得分:0)

在这种特殊情况下,如果不对rh提交的问题进行验证,则只需要一个简单Stub - 只是为了确保在测试NullPointerException时不会引发docall方法。 Mock也是足够的,但是更高级的对象,在这里使用它是没有意义的。当涉及Spy时,它用于验证真实(就未被模拟而言)对象的调用。请看下面的示例 - 只需Stub

即可顺利运行
@Grab('org.spockframework:spock-core:1.0-groovy-2.4')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class Test extends Specification {
    def 'spec'() {
        given:
        def service = new ServiceClient()    
        service.rh = Mock(RequestHelper)

        when:
        service.doCall(new Order())

        then:
        noExceptionThrown()
    }
}

class Order {
    String product
    String quantity
    String profile
}

class OrderType { }

class FACTORY {
    static OrderType CreateOrderType = new OrderType()
}

class RequestHelper {
    public void populateOrderRequestBody(String product, String quantity, String profile, OrderType orderType) {
        orderType.setProduct(product);
        orderType.setQuantity(Integer.parseInt(quantity));
        orderType.setUser(profile.getUserId());
    } 
}

class ServiceClient {
   RequestHelper rh;

   public void doCall(Order order) {
      OrderType  orderType = FACTORY.CreateOrderType;
      rh.populateOrderRequestBody(order.getProduct(), order.getQuantity(), order.getProfile(), orderType);
   }

    public setRequestHelper(RequestHelper rh){
        this.rh=rh;
    }
    public RequestHelper getRequestHelper(){
        return this.rh;
    }
}

答案 1 :(得分:0)

非常类似于Opal的答案,但使用模拟订单..

class Test extends Specification {
def 'spec'() {
    given:
    def service = new ServiceClient()
    def order = Mock(Order)
    order.getProduct() >> 'product1'
    order.getProfile() >> 'profile1'
    order.getQuantity() >> 3


    service.rh = Mock(RequestHelper)

    when:
    service.doCall(order)

    then:
    noExceptionThrown()
    1 * rh.populateOrderRequestBody('product1',3,'profile1',FACTORY.CreateOrderType)
}
}

请注意,这只适用于CreateOrderType.equals()将返回true

的情况