【问题标题】:assign an ArrayList to a List in java将 ArrayList 分配给 java 中的 List
【发布时间】:2015-08-11 14:30:59
【问题描述】:

我正在实现可以考虑以下junit测试的代码:

package it.unica.pr2.pizze.test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.junit.Assert.assertTrue;

import org.junit.Test;
import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.util.*; 
import it.unica.pr2.pizze.*; 

@RunWith(JUnit4.class)
public class TestPizza {

  @Test
    public void test1() {
      Ingrediente mozzarella = new Ingrediente("mozzarella",50);
      Ingrediente pomodoro = new Ingrediente("pomodoro",10);
      Ingrediente[] ingredienti = new Ingrediente[] {mozzarella, pomodoro}
      Pizza pizzaMargherita = new Pizza(ingredienti);
      assertTrue( pizzaMargherita.calorie() == 60 );
      List ingredientiMargherita = pizzaMargherita;
        assertTrue(ingredientiMargherita.size() ==2);
        assertTrue(ingredientiMargherita.get(0) == mozzarella);
        assertTrue(ingredientiMargherita.get(1) == pomodoro);
     }

这是我的课:披萨

package it.unica.pr2.pizze;
import java.util.ArrayList;
import java.util.List;

public class Pizza  {


    private ArrayList<Ingrediente> ingredienti;


    public Pizza(Ingrediente[] ing) {

        this.ingredienti = new ArrayList<>();

        int i = 0;
        while (i < ing.length) {

            this.ingredienti.add(ing[i]);
            i++;
        }

    }

    public double calorie(){

        double sumaCalorie = 0;

        for(Ingrediente elem: this.ingredienti)
            sumaCalorie += elem.getCalorie();

        return sumaCalorie;

    }
}

和另一个类:成分

package it.unica.pr2.pizze;


public class Ingrediente  {


    private String nomeIngrediente;
    private double calorie;



    public Ingrediente(String nomeIngrediente, double calorie) throws IngredienteNonValidoException {

        this.nomeIngrediente = nomeIngrediente;
        if (calorie < 0) throw new IngredienteNonValidoException();
        else
            this.calorie = calorie;
    }

    public void setNomeIng(String nomeIngrediente) {
        this.nomeIngrediente = nomeIngrediente;
    }

    public void setCalorie(double calorie) {

        this.calorie = calorie;
    }

    public String getNomeIng() {

        return this.nomeIngrediente;
    }

    public double getCalorie() {
        return this.calorie;
    }

}

运行测试后出现以下错误:

error: incompatible types: Pizza cannot be converted to List

List ingredientiMargherita = pizzaMargherita;

所以我不知道如何仅使用运算符 = 将 ArrayList 转换为 List,我无法修改 junit 测试代码。

【问题讨论】:

  • 我 99% 确定单元测试代码中存在错误。如果这是一项作业,请回到你的教授那里,询问他们是否真的是指“List ingredientsiMargherita = PizzaMargherita;”这句话。而不是“列出成分iMargherita = PizzaMargherita.getIngrediente();”。否则,唯一的解决方案是标记空间。
  • 是的,测试代码相当可疑。我会验证它没有弄错。需要像 Pizza 这样的值类来实现 List 有点奇怪。
  • 无论是那个还是 OP 试图重写以运行程序。
  • 单元测试没有错误,我找到的解决方法如下。

标签: java list arraylist junit


【解决方案1】:

如果你不能修改分配,你必须这样做:

public class Pizza implements List {
...
}

或者类似的东西,比如

public class Pizza extends AbstractList {
...
}

【讨论】:

  • 从设计的角度来看,这是一个糟糕的解决方案。但它是唯一可以工作的。 +1。
  • 是的,我知道,这有点难看。我认为您对测试用例可能是错字的评论可能值得 OP 检查。
  • 并且没有任何批评的意思,以防你那样做。只是想确保人们不会在不必要的地方尝试这样做。
【解决方案2】:

在单元测试的下一行,您将Pizza 类型分配给List

List ingredientiMargherita = pizzaMargherita;

将其更改为:

List<Ingrediente> ingredientiMargherita = pizzaMargherita.getIngredienti();

并添加一个getIngredienti() 以在您的Pizza 类中返回List

public ArrayList<Ingrediente> getIngredienti(){
     return ingredienti;
}

【讨论】:

  • 这也有效,但是当 OP 说他/她无法修改分配时,我认为不可能像这样修改测试代码。如果可能,这可能是更好的解决方案。
【解决方案3】:

我找到了一个没有编辑junit测试代码的解决方案,我不得不修改我的Pizza.java如下:

package it.unica.pr2.pizze;
import java.util.ArrayList;
import java.util.*;

public class Pizza extends ArrayList   {

    public Pizza(Ingrediente[] ing) {

        for(Ingrediente elem: ing) {

            this.add(elem);
        }

    }

    public int calorie() {
        int calorie = 0;
        for(Object i : this) {
            calorie += ((Ingrediente)i).getCalorie();
        }
        return calorie;
    }


} 

现在测试已正确通过。

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 2020-11-05
    • 2016-07-01
    • 2011-04-14
    • 2017-11-22
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多