You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法的数组处理逻辑完全错误:

  1. 初始化的result是长度为0的数组,当找到匹配商品时,内部的for循环for (int i = 0; i < result.length ; i++)因为result.length为0,循环条件不满足,根本不会执行,所以没有任何元素被添加到结果数组中。
  2. 就算循环能执行,代码逻辑也是替换数组最后一个元素,而不是添加新元素,完全不符合需求。

修复方案

推荐使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:45:43