java - DbUnit 和 JSON 列类型支持

标签 java mysql testing dbunit spring-test-dbunit

我想知道使 DbUnit 与 MySQL 的 JSON(B) 类型列一起工作的最佳方法是什么?我们确实到处都有这样的列,每当我尝试通过 @DatabaseSetup 从 XML 文件提供测试数据时,我都会收到 NoSuchColumnException,这会阻止我与实体或 repos 进行任何合理的集成测试处理 JSON:

org.dbunit.dataset.NoSuchColumnException: assistant_event.AEV_CONTEXT -  (Non-uppercase input column: aev_context) in ColumnNameToIndexes cache map. Note that the map's column names are NOT case sensitive.

我知道这是因为我的 AEV_CONTEXT 列没有被识别,因为它是一个 JSON 列:

@Type(type = "json")
@Column(name = "aev_context", columnDefinition = "json")
private Context context;

但是,我在尝试解决它时遇到了困难。而且,更奇怪的是,我在这里的任何地方都找不到这样的解决方法!事实上,我什至不知道那是更多的 Hibernate 还是 DbUnit。

到目前为止真的只有我有这个问题吗?任何建议将不胜感激!

哦,如果你想知道,这就是我如何获得对 Hibernate 的 JSON 支持:

https://vladmihalcea.com/how-to-map-json-objects-using-generic-hibernate-types/

最佳答案

如果有人需要它,这是 @Aleksi's solution 的 Java 版本对于 PostgreSQL JSONB 数据类型:

import org.dbunit.dataset.datatype.AbstractDataType;
import org.dbunit.dataset.datatype.DataType;
import org.dbunit.dataset.datatype.DataTypeException;
import org.dbunit.dataset.datatype.TypeCastException;
import org.dbunit.ext.postgresql.PostgresqlDataTypeFactory;
import org.postgresql.util.PGobject;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

public class NewPostgresqlDataTypeFactory extends PostgresqlDataTypeFactory {
    @Override
    public DataType createDataType(int sqlType, String sqlTypeName) throws DataTypeException {
        if (sqlTypeName.equals("jsonb")) {
            return new JsonbDataType();
        } else {
            return super.createDataType(sqlType, sqlTypeName);
        }
    }

    public static class JsonbDataType extends AbstractDataType {

        public JsonbDataType() {
            super("jsonb", Types.OTHER, String.class, false);
        }

        @Override
        public Object typeCast(Object obj) throws TypeCastException {
            return obj.toString();
        }

        @Override
        public Object getSqlValue(int column, ResultSet resultSet) throws SQLException, TypeCastException {
            return resultSet.getString(column);
        }

        @Override
        public void setSqlValue(Object value,
                                int column,
                                PreparedStatement statement) throws SQLException, TypeCastException {
            final PGobject jsonObj = new PGobject();
            jsonObj.setType("json");
            jsonObj.setValue(value == null ? null : value.toString());

            statement.setObject(column, jsonObj);
        }
    }
}

关于java - DbUnit 和 JSON 列类型支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52845001/

相关文章:

testing - Internet Explorer 6 模拟器推荐

java - 如何将for循环计算转换为数学公式?

java - Android 10 中没有适用于 Android 开发人员的 IMEI

java - 计算数组中不同元素数量的递归方法

java - Room Java - 是否可以在界面中运行事务?

angular - 当 Cypress E2E 中的任何一个测试失败时,Azure 构建就会失败

java - 在 xsd 上使用 xjc (jaxb)(如 web-app_2_5.xsd)不会创建可用的映射

java - 如何在不使用 JOIN 的情况下为 JPQL 中的 Collection 子句执行参数绑定(bind)?

mysql - 我使用 node.js 创建了一个 rest api,在 .get 方法中我想取回一个 json 数组

python - 从 python 运行和处理外部应用程序