Spock Mock 未返回任何数据

问题描述 投票:0回答:1

我有一个类,它根据产品的产品代码向同一类别中的产品类别添加功能和价格。我有一个相同类别和产品代码的产品列表列表,应为其添加相同的价格和类别。但是,当我为 ProductDecorator 创建模拟时,它无法返回任何产品。我在两个类中的 ProductCode 上使用 Lombok 的 @EqualsAndHashCode.Ininclude

这是代码

public class ProductDetail {
  String productCode;
  String category;
  Double price;

  public String getProductCode() {
    return productCode;
  }
}
class Product {
  String name;
  String productCode;
  String category;
  Double price;

  String getProductCode() {
    return productCode;
  }

  public Product addDetail(String category, Double price) {
    this.category = category;
    this.price = price;
    return this;
  }
}
public class ProductDecorator {
  List<Product> addProductFeature(List<Product> products, List<ProductDetail> details) {
    List<Product> productList = new ArrayList<>();
    products.forEach(product -> {
      details.forEach(detail -> {
        if (product.getProductCode().equals(detail.getProductCode())) {
          Product p = product.addDetail(detail.category, detail.price);
          productList.add(p);
        }
      });
    });
    return productList;
  }
}
  // 3 Products and 3 product details objects that match
  List<List<Product>> products = getProducts()
  List<ProductDetail> productDetailList = getProductDetails()

  ProductDecorator productDecorator = Mock()
  // Returns null all the time for all, just showing the first one
  productDecorator.addProductFeature(products[0],productDetailList)>>[products[0]]  

如何成功模拟装饰器以进行匹配。我认为由于一些平等问题,它不匹配。我尝试使用下划线,但这也不起作用。如果能解决这个问题,我将不胜感激

unit-testing spock
1个回答
0
投票

对我来说,它的工作原理是这样的,所以你的原始代码可能看起来不同:

package de.scrum_master.stackoverflow.q77412076;

import lombok.EqualsAndHashCode;
import lombok.ToString;

@EqualsAndHashCode
@ToString
public class ProductDetail {
  String productCode;
  String category;
  Double price;

  String getProductCode() {
    return productCode;
  }
}
package de.scrum_master.stackoverflow.q77412076;

import lombok.EqualsAndHashCode;
import lombok.ToString;

@EqualsAndHashCode
@ToString
public class Product {
  String name;
  String productCode;
  String category;
  Double price;

  String getProductCode() {
    return productCode;
  }

  Product addDetail(String category, Double price) {
    this.category = category;
    this.price = price;
    return this;
  }
}
package de.scrum_master.stackoverflow.q77412076;

import java.util.ArrayList;
import java.util.List;

public class ProductDecorator {
  List<Product> addProductFeature(List<Product> products, List<ProductDetail> details) {
    List<Product> productList = new ArrayList<>();
    products.forEach(product -> {
      details.forEach(detail -> {
        if (product.getProductCode().equals(detail.getProductCode())) {
          Product p = product.addDetail(detail.category, detail.price);
          productList.add(p);
        }
      });
    });
    return productList;
  }
}
package de.scrum_master.stackoverflow.q77412076

import spock.lang.Specification

class ProductDetailTest extends Specification {
  def 'test without mock'() {
    expect:
    new ProductDecorator().addProductFeature(products[0], productDetails) == [
      new Product(name: 'One', productCode: 'XY-1', category: 'vegetables', price: 12.34),
      new Product(name: 'Two', productCode: 'AB-2', category: 'flowers', price: 23.45),
      new Product(name: 'Three', productCode: 'QR-3', category: 'vegetables', price: 34.56)
    ]
    new ProductDecorator().addProductFeature(products[1], productDetails) == [
      new Product(name: 'Four', productCode: 'XY-1', category: 'vegetables', price: 12.34),
      new Product(name: 'Five', productCode: 'AB-2', category: 'flowers', price: 23.45),
      new Product(name: 'Six', productCode: 'QR-3', category: 'vegetables', price: 34.56)
    ]
  }

  def 'test with mock'() {
    given:
    ProductDecorator productDecorator = Mock()
    productDecorator.addProductFeature(products[0], productDetails) >> products[0]

    expect:
    productDecorator.addProductFeature(products[0], productDetails) == products[0]
    productDecorator.addProductFeature(products[1], productDetails) == null
  }

  List<List<Product>> getProducts() {
    [
      [
        new Product(name: 'One', productCode: 'XY-1'),
        new Product(name: 'Two', productCode: 'AB-2'),
        new Product(name: 'Three', productCode: 'QR-3')
      ],
      [
        new Product(name: 'Four', productCode: 'XY-1'),
        new Product(name: 'Five', productCode: 'AB-2'),
        new Product(name: 'Six', productCode: 'QR-3')
      ]
    ]
  }

  List<ProductDetail> getProductDetails() {
    [
      new ProductDetail(productCode: 'XY-1', category: 'vegetables', price: 12.34),
      new ProductDetail(productCode: 'AB-2', category: 'flowers', price: 23.45),
      new ProductDetail(productCode: 'QR-3', category: 'vegetables', price: 34.56)
    ]
  }
}

请注意:模拟应该返回

products[0]
而不是
[products[0]]
,因为
ProductDecorator.addProductFeature
返回
List<Product>
,而不是
List<List<Product>>
。但这不是问题的根本原因。

© www.soinside.com 2019 - 2024. All rights reserved.