我有一个类,它根据产品的产品代码向同一类别中的产品类别添加功能和价格。我有一个相同类别和产品代码的产品列表列表,应为其添加相同的价格和类别。但是,当我为 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]]
如何成功模拟装饰器以进行匹配。我认为由于一些平等问题,它不匹配。我尝试使用下划线,但这也不起作用。如果能解决这个问题,我将不胜感激
对我来说,它的工作原理是这样的,所以你的原始代码可能看起来不同:
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>>
。但这不是问题的根本原因。