Java 如何正确地从ApachePOI数据验证器强制转换显式ListValue以进行测试?

Java 如何正确地从ApachePOI数据验证器强制转换显式ListValue以进行测试?,java,junit,casting,apache-poi,Java,Junit,Casting,Apache Poi,我已将数据约束添加到Apache POI工作簿的工作表中。现在我想添加一个单元测试 我的约束是两个值的简单列表,“是”和“否” 我目前的尝试: Assert.assertEquals( Arrays.toString("yes,no".split(",")), Arrays.toString(dv.get(0).getValidationConstraint().getExplicitListValues())); } 失败于 expected:<[[yes, no]]>

我已将数据约束添加到Apache POI工作簿的工作表中。现在我想添加一个单元测试

我的约束是两个值的简单列表,“是”和“否”

我目前的尝试:

Assert.assertEquals(
  Arrays.toString("yes,no".split(",")),
  Arrays.toString(dv.get(0).getValidationConstraint().getExplicitListValues()));
}
失败于

expected:<[[yes, no]]> but was:<[["yes, no"]]

没关系,
array.toString(…getExplicitListValues())
的输出总是会显示额外的引号

--编辑2:

为了解决这个问题,我按照@axel ichter建议的方式创建了这个列表:

XSSFDataValidationConstraint c =
  (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(
  "\"yes,no".split(","));
然后我得到了一些别的东西:

expected:<[[yes, no]]> but was:<[[""yes, no"]]>

无法复制您的问题。使用apache poi 4.0.1以下代码:

import java.io.FileOutputStream;
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import java.util.List;
import java.util.Arrays;

class CreateExcelDataValidationLists {

 public static void main(String[] args) throws Exception {

  Workbook workbook = new XSSFWorkbook();
  Sheet sheet = workbook.createSheet("Sheet1");
  DataValidationHelper dvHelper = sheet.getDataValidationHelper();
  String constraint = "yes,no";
  DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(constraint.split(",")) ;
  CellRangeAddressList addressList = new CellRangeAddressList(0,0,0,0);          
  DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
  sheet.addValidationData(validation);

  FileOutputStream out = new FileOutputStream("CreateExcelDataValidationLists.xlsx");
  workbook.write(out);
  out.close();
  workbook.close();

  Thread.sleep(1000);

  workbook = WorkbookFactory.create(new FileInputStream("CreateExcelDataValidationLists.xlsx"));
  sheet = workbook.getSheetAt(0);

  @SuppressWarnings("unchecked")
  List<DataValidation> validations = (List<DataValidation>)sheet.getDataValidations();

  System.out.println(Arrays.toString(validations.get(0).getValidationConstraint().getExplicitListValues()));

 }
}

刚刚测试过。同样的代码使用ApachePOI3.14确实会产生

["yes, no"]

列表约束是如何设置的?必须是
…createExplicitListConstraint(新字符串[]{“是”、“否”})
。似乎是
…createExplicitListConstraint(新字符串[]{“\”yes,no\\”}
。我使用(此处简化):
createExplicitListConstraint(“yes,no”.split(“,”)
),因为列表值来自一个资源/db,该资源/db为每个集合保存一个本地化字符串。Hm,但是
dv.get(0).getValidationConstraint()的结果.getExplicitListValues())
看起来更像
createExplicitListConstraint(“\”是,否“).split(“,”)
。我用创建它的所有方法编辑它。。。无法解释。也许这是POI代码中的错误?请看我的新的第二次编辑。额外的引号总是在那里,即使我按照你的建议包括引号。。。然后我得到两个额外的报价!我从未建议添加额外的引号。我所说的是,看起来你的字符串中已经有了额外的引号。谢谢分享!我在3点14分。可能是一只老虫子。。。将尝试更新。已确认!更新到4.0.1,我所有的问题都消失了!!!非常感谢!
ArrayUtils.contains( ....getExplicitListValues(), "yes") // returns null;

...getExplicitListValues().getClass().getTypeName() // java.lang.String[]
import java.io.FileOutputStream;
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddressList;
import java.util.List;
import java.util.Arrays;

class CreateExcelDataValidationLists {

 public static void main(String[] args) throws Exception {

  Workbook workbook = new XSSFWorkbook();
  Sheet sheet = workbook.createSheet("Sheet1");
  DataValidationHelper dvHelper = sheet.getDataValidationHelper();
  String constraint = "yes,no";
  DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(constraint.split(",")) ;
  CellRangeAddressList addressList = new CellRangeAddressList(0,0,0,0);          
  DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);
  sheet.addValidationData(validation);

  FileOutputStream out = new FileOutputStream("CreateExcelDataValidationLists.xlsx");
  workbook.write(out);
  out.close();
  workbook.close();

  Thread.sleep(1000);

  workbook = WorkbookFactory.create(new FileInputStream("CreateExcelDataValidationLists.xlsx"));
  sheet = workbook.getSheetAt(0);

  @SuppressWarnings("unchecked")
  List<DataValidation> validations = (List<DataValidation>)sheet.getDataValidations();

  System.out.println(Arrays.toString(validations.get(0).getValidationConstraint().getExplicitListValues()));

 }
}
[yes, no]
["yes, no"]