当前位置: 首页 > 知识库问答 >
问题:

JUnit-参数中包含对象的测试类实例化

闻人献
2023-03-14

我对JUnit测试非常陌生,我试图理解如何测试类的实例化。

假设我有以下ToyBox类,它需要一个ArrayList 来实例化。当然,这个玩具列表是在程序的另一部分上创建的,但是我不太清楚应该在哪里创建它,以便对Toybox进行单元测试。

public ToyBox(ArrayList<Toy> toyList){
    this.toys= toyList;

    for (Toy toy: toyList) {
        checkToy(toy);
    }
}

private void checkToy(Toy toy){
    if (toy.isRed()){
        this.numRed += 1;
    } else {
        this.numBlue += 1;
    }
}
public int getBlues(){
    return this.numBlue;
}
public class ToyBoxTest {

    @Test
    public void getNumBlues() throws Exception {
        // assert that num blues corresponds
    }

应该是这样吗?

public class ToyBoxTest {
    ArrayList<Toy> toyList = new ArrayList<Toy>();
    Toy toy1 = new Toy("blue", "car");
    Toy toy2 = new Toy("red", "bike");
    toyList.add(toy1);
    toyList.add(toy2);

    @Test
    public void getNumBlues() throws Exception {
        // assert that num blues corresponds
        ToyBox box = new ToyBox(toyList);
        assertEquals(1, box.getBlues());
    }

基本上,我的问题是应该在哪里以及如何创建测试依赖于创建的列表的类所需的arraylist对象

共有1个答案

丰胤运
2023-03-14

大多数教程都会指出,最佳实践是在setup方法(JUnit术语中的@before方法)中实例化将要测试的对象。然而,您的usecase并不适合这种模式。由于构造函数保存所有逻辑,因此应该在测试本身中实例化对象,然后断言getnumblues()getnumreds()返回正确的结果。例如:

@Test
public void bothColors() throws Exception {
    ArrayList<Toy> toyList = new ArrayList<>(Arrays.asList
        new Toy("blue", "car"),
        new Toy("red", "bike"));
    ToyBox box = new ToyBox(toyList);
    assertEquals(1, box.getBlues());
}

@Test
public void justBlues() throws Exception {
    ArrayList<Toy> toyList = new ArrayList<>(Arrays.asList
        new Toy("blue", "car"),
        new Toy("blue", "bike"));
    ToyBox box = new ToyBox(toyList);
    assertEquals(2, box.getBlues());
}

// etc...
 类似资料:
  • 问题内容: 有没有办法确定对象是否是泛型类型的实例? 这显然行不通。还有其他选择吗?就像我想使用Java反射来实例化一个类,然后检查以确保它是通用类型。 问题答案: 进行此检查的唯一方法是,是否具有表示类型的对象:

  • 问题内容: 在JUnit 4中,使用批注很容易在多个类中测试不变式。关键是要针对单个参数列表运行一组测试。 如何在不使用JUnit-vintage的情况下在JUnit 5中复制它? 不适用于测试课程。听起来似乎很合适,但是注释的目标也是一种方法。 此类JUnit 4测试的示例是: 问题答案: JUnit 5中的参数化测试功能所提供的 功能与JUnit 4所提供的功能完全不同。引入了具有更大灵活性的

  • 问题内容: 是否使用对象的新(或不同)实例来运行JUnit测试用例中的每个测试方法?还是一个实例可用于所有测试? 运行此测试时,将创建多少个类实例? 如果可能的话,提供一个指向文档或源代码的链接,我可以在其中验证行为。 问题答案: 我在JUnit文档中找不到关于您问题的明确答案,但正如anjanb所写,其目的是每个测试都独立于其他测试,因此可以为要运行的每个测试创建一个新的TestCase实例。

  • 主要内容:1. CharUtil类,2. TestNG @DataProvider示例另一个TestNG参数测试示例,是使用注解。 1. CharUtil类 创建一个将字符转换成ASCII或者副词的类,如何使用TestNG来做单元测试? 打开 Eclipse 创建一个 Maven 工程: ParameterTesting,其目录结构如下所示 - 类文件:CharUtils.java 的代码如下 - 2. TestNG @DataProvider示例 要测试它,创建一个接受两个参数(

  • 问题内容: 有时我需要测试哪个类声明了一些变量,如果具体类包含具有某些名称的变量,还有另一种方法可以测试该变量 问题答案: 如果我理解正确,则可以在超类中使用此代码来测试子类是否具有字段。 为什么不简单地添加这样的方法? 对我来说似乎更多面向对象,不会破坏封装。 就是说,我并没有真正理解您为什么首先需要它。