Java初学者求助:searchBy方法无法正确返回匹配商品数组
问题:searchBy方法始终返回空数组导致JUnit测试失败
我是Java初学者,实现了一个返回所有匹配商品数组的searchBy方法,但该方法一直返回空数组,导致JUnit测试用例shouldFindProducts执行失败,报错信息:
org.opentest4j.AssertionFailedError: array lengths differ, expected: <1> but was: <0>
原代码
ProductManager类
public class ProductManager { private ProductRepository repo; public ProductManager(ProductRepository repo) { this.repo = repo; } public void add(Product product) { repo.save(product); } public Product[] searchBy(String text) { Product[] result = new Product[0]; for (Product product : repo.findAll()) { if (matches(product, text)) { for (int i = 0; i < result.length ; i++) result[result.length - 1] = product; } } return result; } public boolean matches(Product product, String search) { if (product.getName().contains(search)) { return true; } else { return false; } } }
测试类
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class ProductManagerTest { ProductRepository repo = new ProductRepository(); ProductManager manager = new ProductManager(repo); Product product1 = new Product(1, "футболка", 550); Product product2 = new Product(2, "весна", 480); Product product3 = new Product(45, "iphone 12", 34800); @BeforeEach public void setup() { manager.add(product1); manager.add(product2); manager.add(product3); } @Test public void shouldFindProducts() { manager.matches(product2, "весна"); Product[] expected = {product2}; Product[] actual = manager.searchBy("весна"); Assertions.assertArrayEquals(expected, actual); } }
错误原因
searchBy方法的数组处理逻辑完全错误:
- 初始化的
result是长度为0的数组,当找到匹配商品时,内部的for循环for (int i = 0; i < result.length ; i++)因为result.length为0,循环条件不满足,根本不会执行,所以没有任何元素被添加到结果数组中。 - 就算循环能执行,代码逻辑也是替换数组最后一个元素,而不是添加新元素,完全不符合需求。
修复方案
推荐使用ArrayList来动态收集匹配的商品,最后再转换为数组,逻辑更简单不易出错:
修正后的ProductManager类
import java.util.ArrayList; import java.util.List; public class ProductManager { private ProductRepository repo; public ProductManager(ProductRepository repo) { this.repo = repo; } public void add(Product product) { repo.save(product); } public Product[] searchBy(String text) { List<Product> matchingProducts = new ArrayList<>(); for (Product product : repo.findAll()) { if (matches(product, text)) { matchingProducts.add(product); } } // 将List转换为Product数组,指定数组类型和长度 return matchingProducts.toArray(new Product[matchingProducts.size()]); } public boolean matches(Product product, String search) { // 简化为一行代码 return product.getName().contains(search); } }
测试类优化
测试方法中的manager.matches(product2, "весна");是冗余代码,不影响测试结果但可以删除,优化后的测试方法:
@Test public void shouldFindProducts() { Product[] expected = {product2}; Product[] actual = manager.searchBy("весна"); Assertions.assertArrayEquals(expected, actual); }
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

