在JPA实体

时间:2016-01-06 06:35:08

标签: java sql-server jpa dbunit

我正在为一些现有功能创建一些单元测试。

我正在使用带有嵌入式H2数据库的DBUnit来测试一些JPA实体。 我们的生产环境使用SQL Server。

我遇到的问题是我需要在其中一个实体上的Blob列上执行某些操作,但似乎我将Blob数据的内容从一个SQL Server行复制到我的dbunit xml数据集中,当我从字节中实例化一个字符串时,它不代表我期望的文本。

实体的片段:

@Entity
@Table(name = "mn_gateway_template")
public class GatewayTemplate implements Serializable {

@Lob
@Column(name = "config_file_bytes", length = 500000)
private byte[] configFileBytes;

}

要保存字节,我这样做:

GatewayTemplate template = entityManager.find(GatewayTemplate.class, 1l);
byte[] bytes = postedStringContent.getBytes();
template.setConfigFileBytes(bytes);
entityManager.persist(template);

我的数据集:

 <?xml version="1.0" encoding="UTF-8"?>
    <dataset>
      <mn_gateway_template id="4" disabled="0" description="A config file" config_file_bytes="00101111  01101001  01101110  01110100" />
    </dataset>

我的spring-test-mvc测试:

@Test
@WithMockUser
public void testSaveEditedTemplate() throws Exception {

    Account account = new Account();
    account.setId(1l);


    mvc.perform(
                post("/admin/gateway/config/template/save")
                        .sessionAttr("account", account)
                        .param("configTemplateFileName", "testConfig.txt")
                        .param("configFileText", "/log :info \"This is my config file \"")
                        .param("configurationOwnerAccount","1")
                        .param("model", "1")
                        .param("termsAccepted", "true")
                        .param("masterTemplateId", "1")

                    );

    entityManager.getTransaction().commit();
    entityManager.getTransaction().begin();

    GatewayTemplate editedTemplate = entityManager.find(GatewayTemplate.class, 1l );
    Assert.assertEquals("/log :info \"This is my config file \"", editedTemplate.getConfigFileText());


}

测试基本上是模拟String的帖子。我只是调用String.getBytes()方法来获取Blob数据并保存它。 在实际应用程序中,当我检索Blob数据并从中实例化String时,String表示我在UI上发布的内容,但是当数据集中使用DBUnit提供字节时,Assertion失败。请参阅下文。

org.junit.ComparisonFailure:expected:&lt; [/ log:info“这是我的配置文件”]&gt;但是:&lt; [ѮѮ 㝴㝴㝴㝴 ѭM޸ñ޻ޞ獴yNtn = 5N} N} MN ^ 띴﮵nεmmߝNxNѭ〜v59Nx ^ 69M뎶 랜Ο޵MMN덴ñ뾽了Ntn = 5N} L }的N×N] GT;     在org.junit.Assert.assertEquals(Assert.java:115)     在org.junit.Assert.assertEquals(Assert.java:144)     在za.co.wifire.admin.api.controller.gateway.GatewayTemplateControllerTest.testSaveEditedTemplate(GatewayTemplateControllerTest.java:133)

我认为这是由于编码差异......

1 个答案:

答案 0 :(得分:0)

事实证明,DBUnit仅支持Base64编码字符串形式的二进制数据。

认为我的问题在设计上比其他任何事情都要多。 blob列实际上应该是一个简单的字符串,但它以前是一个blob来容纳文件上传,并且不能更改,因为它当前包含我们需要的数据。