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

单元测试所有集合不能为空的通用方法

景俊拔
2023-03-14

我经常创建包含某种集合(集、列表,随便什么)的对象。它们永远不能为空。如果构造函数或setter传递null,则创建空集合的新实例。下面是一个带有错误的示例(用注释标记)。

package com.myapp;

import com.google.common.collect.Lists;

import java.util.List;

public class MyClass {
    private List<String> myNeverNullList1;
    private List<String> myNeverNullList2;

    public MyClass(List<String> myNeverNullList1, List<String> myNeverNullList2) {

        this.myNeverNullList1 = myNeverNullList1==null? Lists.newArrayList():myNeverNullList1;
        this.myNeverNullList2 = myNeverNullList2==null? Lists.newArrayList():myNeverNullList2;
    }

    public void setMyNeverNullList1(List<String> myNeverNullList1) {
        this.myNeverNullList1 = myNeverNullList1==null? Lists.newArrayList():myNeverNullList1;
    }

    public void setMyNeverNullList2(List<String> myNeverNullList2) {
        //OOPS, I forgot to put the null check here, should be caught by Unit Tests
        this.myNeverNullList2 = myNeverNullList2;
    }
}

我在一个单元测试一个单元测试中测试这种行为,但是为每个集合编写如此简单的测试是很繁琐的。有没有什么库,可以帮助我自动测试这种行为?

共有1个答案

单于钊
2023-03-14

一般的答案是:使您的字段为最终字段,不允许以后设置它。然后编译器为您做所有的检查。换句话说:使您的策略在默认情况下对象是不可变的;只有在你有充分理由的情况下才会偏离这个政策。

如果有充分的理由在你的类中拥有多个“可设置”列表(老实说:我想不出),那么下一个最好的方法就是编写一个“仅测试”的反射实用程序,它使用反射来获取所有具有匹配setter的列表/集合字段...首先使用null调用setter,然后检查字段是否为null。

 类似资料:
  • 为什么会这样?并不是说我绝对需要一个测试方法,我只是好奇而已。当您生成测试方法时,Visual Studio 2012不会给出警告或错误,即使它将无法运行。..

  • 测试方法: 测试用例:

  • 单元测试 单元测试仅依赖于源代码,是测试代码逻辑是否符合预期的最简单方法。 运行所有的单元测试 make test 仅测试指定的package # 单个package make test WHAT=./pkg/api # 多个packages make test WHAT=./pkg/{api,kubelet} 或者,也可以直接用go test go test -v k8s.io/kubernet

  • 在我认为是彻底的谷歌搜索后,我只能找到一种方法来做这件事与声纳。有没有更简单的方法可以做到这一点? 相关问题:Maven分离单元测试和集成测试

  • 我的问题是:我是否应该修复我的单元测试,因为他们没有找到错误?单元测试不应该考虑其他类吗?我只是修改了我的生产性代码,因为集成测试覆盖这些内容就足够了。 编辑: 由于这些答复,似乎有必要进一步说明我的问题。我仍然不确定哪个测试负责什么。 好吧,我的测试有100%的代码复盖率,我创造的突变体被我的测试检测到,所以一切看起来都很好。 我的第二个类是一个处理程序,它负责在每次调用handler.next

  • 问题是,在您的应用程序项目中拥有一个除了为您的测试项目生成数据之外没有其他目的的方法是否是一种糟糕的做法。