Java中Getter/Setter及方法可用性检查报错求助
问题描述
这是我第一次在StackOverflow发帖,还在适应格式,提前致歉。我拥有FruitBasket和FruitBasketUtility两个类,已在FruitBasket.java中实现Getter和Setter方法,代码编译正常,但出现如下错误:
Fail 1 -- test11addToBasketMethodToAddOneFruitBasketObject::
Check the availability (or) the signature of addToBasket/getFruitBasketList in the FruitBasketUtility class or Setters and Getters in FruitBasket class
相关代码
Main.java
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args){ //For reading input from user Scanner in = new Scanner(System.in); //Creating object of FruitBasketUtility FruitBasketUtility fruitBasketUtility = new FruitBasketUtility(); int choice; do{ //Displaying the menu System.out.println("Select an option:"); System.out.println("1. Add Fruit to Basket"); System.out.println("2. Calculate Bill"); System.out.println("3.Exit"); //Reading the choice choice = in.nextInt(); in.nextLine(); switch(choice){ case 1: //Reading fruit details from user System.out.println("Enter the fruit name"); String fruitName = in.next(); in.nextLine(); System.out.println("Enter weight in Kgs"); int weightInKgs = in.nextInt(); in.nextLine(); System.out.println("Enter price per Kg"); int pricePerKg = in.nextInt(); in.nextLine(); FruitBasket fruit = new FruitBasket(fruitName, weightInKgs, pricePerKg); //Adding fruit to basket fruitBasketUtility.addToBasket(fruit); break; case 2: //Calculating and showing the bill ArrayList<FruitBasket> basket = fruitBasketUtility.getFruitBasketList(); if(basket.size() > 0){ System.out.println("The estimated bill amount is Rs " + fruitBasketUtility.calculateBill((basket.stream()))); } else{ System.out.println("Your basket is empty. Please add fruits."); } break; case 3: System.out.println("Thank you for using the application."); break; default: System.out.println("Invalid option. Please try again."); break; } }while(choice != 3); } }
FruitBasket.java
public class FruitBasket { //Member variables String fruitName; int weightInKgs; int pricePerKg; //Getters and setters public void setFruitName(String fruitName){ this.fruitName =fruitName; } public void setWeightInKgs(int weightInKgs){ this.weightInKgs =weightInKgs; } public void setPricePerKg(int pricePerKg){ this.pricePerKg =pricePerKg; } public String getFruitName(){ return fruitName; } public int getWeightInKgs(){ return weightInKgs; } public int getPricePerKg(){ return pricePerKg; } //An empty constructor public FruitBasket(){ fruitName = ""; weightInKgs = 0; pricePerKg = 0; } //Three argument constructor public FruitBasket(String fruitName, int weightInKgs, int pricePerKg){ this.fruitName = fruitName; this.weightInKgs = weightInKgs; this.pricePerKg = pricePerKg; } }
FruitBasketUtility.java
import java.util.ArrayList; import java.util.stream.Stream; public class FruitBasketUtility { //Member variables ArrayList<FruitBasket> fruitBasketList; //Getters and setters public void setFruitBasketList(ArrayList<FruitBasket> fruitBasketList){ this.fruitBasketList = fruitBasketList; } public ArrayList<FruitBasket> getFruitBasketList(){ return fruitBasketList; } //Constructor public FruitBasketUtility(){ fruitBasketList = new ArrayList<>(); } //Add to basket public void addToBasket(FruitBasket fObj){ fruitBasketList.add(fObj); } //Calculte the bill using stream of FruitBasket public int calculateBill(Stream<FruitBasket> fruitBasketStream){ return fruitBasketStream.mapToInt(x -> x.getPricePerKg() * x.getWeightInKgs()).sum(); } }
排查与解决步骤
核对方法签名一致性
测试用例报错指向addToBasket或getFruitBasketList的签名问题,重点检查:addToBasket方法:当前代码是public void addToBasket(FruitBasket fObj),确保测试用例调用时传入的参数类型为FruitBasket,且方法修饰符为public(当前代码已满足)。getFruitBasketList方法:当前返回ArrayList<FruitBasket>,如果测试用例期望的是父接口List<FruitBasket>,部分严格框架会判定不匹配。可以修改返回类型为List<FruitBasket>,同时把成员变量也声明为List<FruitBasket>,保持上下一致:// 修改FruitBasketUtility的成员变量和Getter List<FruitBasket> fruitBasketList; public List<FruitBasket> getFruitBasketList(){ return fruitBasketList; }
验证Getter方法的可访问性
虽然你的getPricePerKg、getWeightInKgs等都是public,但要确认测试用例是否能正常访问——比如类是否在同一包下,有没有误改访问修饰符。确认初始化逻辑无问题
检查FruitBasketUtility的构造函数是否正确初始化了fruitBasketList,当前代码里fruitBasketList = new ArrayList<>()是正确的,避免测试时出现空指针导致测试用例失败。手动验证核心逻辑
写一段简单的测试代码验证addToBasket和getFruitBasketList的功能:public static void testAddFunction() { FruitBasketUtility util = new FruitBasketUtility(); FruitBasket testFruit = new FruitBasket("Banana", 3, 50); util.addToBasket(testFruit); // 输出应为1,说明添加成功 System.out.println("Basket size after add: " + util.getFruitBasketList().size()); }如果这段代码输出1,说明你的方法逻辑没问题,那大概率是测试用例的校验点不匹配,比如方法名拼写错误(比如测试用例找的是
addToBasketList而非addToBasket)。
内容的提问来源于stack exchange,提问作者John

