Я создаю некоторые модульные тесты для некоторых существующих функций.Кодирование столбца DBUnit Blob на объекте JPA
Я использую DBUnit со встроенной базой H2 для тестирования некоторых объектов JPA. В нашей производственной среде используется SQL Server.
Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно выполнить некоторые операции над столбцом Blob на одном из сущностей, но кажется, что если я скопирую содержимое данных Blob из одной из строк SQL Server в свой dbunit xml dataset, когда я создаю экземпляр String из байтов, он не представляет текст, который я ожидаю.
Отрывок сущности:
@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>
Моя весна-тест-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.getBytes(), чтобы получить данные Blob и сохранить его. В реальном приложении, когда я извлекаю данные Blob и создаю экземпляр String из него, String представляет именно то, что я разместил в пользовательском интерфейсе, но когда байты предоставлены в наборе данных, DBUnit Assertion не работает. См. Ниже.
org.junit.ComparisonFailure: ожидаемое < [/ Журнал: Информация "Это мой конфигурационный файл"]> но: < [Ѯ7n9^х 㝴 5n 㝴 п ﮹ Μ _ ~ 뾟 n} ѭѭM N ޞ 獴 у НТН = 5n} N}^МН 띴 ﮵ nεmm ߝ NxN ѭ ~ v59Nx^69м 뎶랜 Ο мМ N 덴 n 뾽 Nt n = 5 n} N } N x N ]> at org.junit.Assert.assertEquals (Assert.java : 115) at org.junit.Assert.assertEquals (Assert.java:144) at za.co.wifire.admin.api.controller.gate way.GatewayTemplateControllerTest.testSaveEditedTemplate (GatewayTemplateControllerTest.java:133)
Я полагаю, что это происходит из-за разницы кодирования ...
Так почему бы не представить код, потому что прямо сейчас нечего комментировать. Или вопрос –
Добавили код с немного дополнительной информацией по вашему запросу. –
Как насчет Сущности? вы знаете, вещь с этим Blob. Сохранение сущности? Вызывается SQL для сохранения BLOB. –