2016-01-06 6 views
0

Я создаю некоторые модульные тесты для некоторых существующих функций.Кодирование столбца 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)

Я полагаю, что это происходит из-за разницы кодирования ...

+0

Так почему бы не представить код, потому что прямо сейчас нечего комментировать. Или вопрос –

+0

Добавили код с немного дополнительной информацией по вашему запросу. –

+0

Как насчет Сущности? вы знаете, вещь с этим Blob. Сохранение сущности? Вызывается SQL для сохранения BLOB. –

ответ

0

Оказывается, что DBUnit поддерживает только двоичные данные в виде Base64 закодированной строки.

Думайте, что моя проблема больше в дизайне, чем что-либо еще. Столбец blob на самом деле должен быть простой строкой, но раньше он был blob для размещения загрузок файлов и не мог быть изменен, поскольку в настоящее время он содержит данные, которые нам нужны.

Смежные вопросы