我正在为一些现有功能创建一些单元测试。
我正在使用带有嵌入式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)
我认为这是由于编码差异......
答案 0 :(得分:0)
事实证明,DBUnit仅支持Base64编码字符串形式的二进制数据。
认为我的问题在设计上比其他任何事情都要多。 blob列实际上应该是一个简单的字符串,但它以前是一个blob来容纳文件上传,并且不能更改,因为它当前包含我们需要的数据。