Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
Народ подскажите пож - у меня есть джейсон файл - нужно его прочитать и положить в массив с байтами
есть какие то для этого инструменты?
24 июл 20, 14:00    [22173170]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10418
А если до написания (тупого) вопроса в форум две минуты подумать?
24 июл 20, 14:07    [22173174]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3312
Zzz79
Народ подскажите пож - у меня есть джейсон файл - нужно его прочитать и положить в массив с байтами
есть какие то для этого инструменты?


Можно строку в массив байт сконвертировать.
24 июл 20, 18:58    [22173371]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
mayton
Member

Откуда: loopback
Сообщений: 47971
А что будет потом с байтами? Они же бесполезны для работы по JSon технологиям. Надо будет обратныть его разворачивать.

А тогда зачем заворачивать?
24 июл 20, 19:59    [22173392]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10418
Разово считать в память и многократно использовать как поток ввода?
24 июл 20, 21:49    [22173433]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
mayton
А что будет потом с байтами? Они же бесполезны для работы по JSon технологиям. Надо будет обратныть его разворачивать.

А тогда зачем заворачивать?


там вообщем вот такая суть

я загружаю шаблон документа- он в джейсон формате
далее я беру этот джейсон в байтах я так понимаю и ObjectMapper собирает его мне в нужный объект
public static IDictionary dic(OperationContext context) {
		byte[] fileData = (byte[]) context.getProperties().getObjectRaise("FILEDATA");


		TemplateGroup[] templates = new TemplateGroup[0];
		try {
			templates = new ObjectMapper().readValue(fileData, TemplateGroup[].class);
		} catch (IOException e) {

		}
		IDictionary dic = Context.newDictionary("doc_maker/doc/template_group");

		Arrays.stream(templates).forEach(item -> {
					IDataItemModel record = dic.getNewDataRecord();
					record.set("GROUP_CODE", item.getGroupCode());
					record.set("GROUP_NAME", item.getGroupName());
					record.set("GROUP_DESCRIPTION", item.getGroupDescription());
					record.set("GROUP_ORDER", item.getGroupOrder());
				}
		);
		return dic;
	}


вот этот метод

мне нужно написать на него тест,сравнить что объект взятый из памяти и прописаный по полям в рекоды будет идентичен- как это сделать я пока не пойму

я пытаюсь подложить мокнуть контекст и положить в проперть FILEDATA массив байт из джейсона и далее уже что то думать

но пока ничего не получается.

если надо я могу скинуть весь проект целиком или отдельные классы или буду рад любой помощи
25 июл 20, 10:04    [22173516]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
Это метод который инкапсулируется методом getObjectReise


public Object getObject(String name, Object defaultValue, Map<String, Object> params) {
		Object value = get(name, defaultValue, params);
		return value instanceof CusterpProperties ? defaultValue : value;
	}

public Object get(String key, Object defaultValue, Map<String, Object> params) {
		if (StringTools.isEmpty(key))
			return this;


по сути мне надо посмотреть что объект который я собираюсь записать в рекорды - валиден
тоесть сравнить что было вытащено из памяти и сравнить с тем чем я хочу

ну и далее еще запись в справочник проверить что записалось - но вообще не понятно как делать
25 июл 20, 10:17    [22173519]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
Вот сам тест

package com.custsystems.dictionary.docMaker.template;

import com.custsystems.custerp.dictionary.dictionaryStorage.DataItemSet;
import com.custsystems.custerp.docflow.documentAction.DocumentAction;
import com.custsystems.custerp.docflow.documentDictionary.DocumentDictionary;
import com.custsystems.custerp.docflow.operations.OperationContext;
import com.custsystems.custerp.kernel.custerpProperties.CusterpProperties;
import com.custsystems.dictionary.docMaker.templateGroup.load.export.TemplateGroup;
import com.custsystems.dictionary.docMaker.templateGroup.load.imports.Import;
import com.custsystems.test.TestDataItemModel;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import java.nio.charset.StandardCharsets;

import static org.junit.Assert.assertEquals;


@RunWith(MockitoJUnitRunner.class)
public class TemplateGroupImportTest {


	private CusterpProperties properties ;
	@Mock
	private DataItemSet docs;
	@Mock
	private DocumentDictionary owner;
	@Mock
	private DocumentAction action;



	//public OperationContext context =new OperationContext(owner,action,false,docs,properties.addProperty("FILEDATA",1));

	private TemplateGroup templateGroup;

	private TestDataItemModel testDataItemModel;

	private DataItemSet dataItemSet;

	@Before
	public void setUp() {
		//Mockito.reset(context);
		//properties.addProperty("FILEDATA",new Object());
		testDataItemModel = new TestDataItemModel();
		dataItemSet = new DataItemSet();
		templateGroup = TemplateGroup.builder()
				.groupCode("2")
				.groupName("sss")
				.groupDescription("sds")
				.groupOrder(1)
				.build();
	}

	@Test
	 public void positiveTest() {
		byte[]bytes=templateGroup.toString().getBytes(StandardCharsets.UTF_8);
		properties=new CusterpProperties();
		properties.addProperty("FILEDATA",bytes);
		 OperationContext context =new OperationContext(owner,action,false,docs,properties);
	//	byte[]bytes=templateGroup.toString().getBytes(StandardCharsets.UTF_8);
	//	when(context.getProperties().getObjectRaise("FILEDATA")).thenReturn(bytes);
		testDataItemModel.set("GROUP_CODE", "2");
		testDataItemModel.set("GROUP_NAME", "sss");
		testDataItemModel.set("GROUP_DESCRIPTION", "sds");
		testDataItemModel.set("GROUP_ORDER", 1);
		assertEquals(testDataItemModel.get("GROUP_CODE"), Import.dic(context).getNewDataRecord().get("GROUP_CODE"));


	}

}


падает nullpointer вот тут в тестируемом методе

IDictionary dic = Context.newDictionary("doc_maker/doc/template_group");
25 июл 20, 10:35    [22173523]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
похоже в реальном приложении где то создается этот справочник
в тесте его нет
как его мокнуть тоже непонятно ппц короче
25 июл 20, 10:44    [22173525]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
забыл ник
Member

Откуда:
Сообщений: 3370
Тест у тебя не получается написать по одной простой причине, потому что код говно.
Все моки от лукавого, хотя когда писал на java тоже приходилось такое лобать. Но сейчас понимаю что нету ни одной причины, которая могла бы оправдать их написание.
Если ты готов попробовать пораскинуть мозгами и понять как делать правильно - то прочитай следующее внимательно -
1) Перед тем как тестировать этот код, его надо отрефакторить. Тесты, в том числе нужны для того, чтобы понять какие зависимости есть в коде, как его вызывает сторонний код и как его сделать правильнее\удобнее
2) Старайся делать свои функции "чистыми", то есть у тебя строго сконструированные входные параметры(не контексты, энвайрнменты, вебсессии и прочяя хрень, а строка, число, объект юзер , объект темплейт и т.д), у тебя выход функции должен зависеть только от входа и всегда давать один и тот же выход(при тех же входных параметров), то есть никаких зависимостей от внешнего мира и пробрасывания эксепшенов.
3) Все действия с контекстами, сессиями, коннекшенами и т.д, всем тем что хранит состояние внешнего мира тебе надо вынести на уровень выше, в код-обвязку, которая не тестируется юнит-тестами, а тестируется интеграционными.
4) В таком случае тебе останется протестировать бизнес лошику - ты передаешь в функцию объект, а она на основе объекта что-то делает и никакой свистопляски с контекстом.
5) Иногда, особенно в Java мире абстракцию делают на основе интерфейса, это тоже вариант. То есть ты можешь переписать код чтобы он принимал интерфейс IContext, в реальном приложеии это будет реальный обхект, а в тесте моковый. Так тоже можно, но я предпочитаю все же чистые функции

Ты конечно можешь продолжать ныть, что мол код уже написан, мое дело малое и тд - ну так какого ты ответа тогда ждешь? Либо колупайся сам дальше в говне, либо пойди и скажи что код говно и нетестируемый, но ты знаешь как правильно переписать, в таком случае поможем и подскажем.
25 июл 20, 13:04    [22173548]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
mayton
Member

Откуда: loopback
Сообщений: 47971
Да. FP programming style хорош хотя бы тем что идеально тестабелен.
25 июл 20, 13:10    [22173550]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
забыл ник
Тест у тебя не получается написать по одной простой причине, потому что код говно.
Все моки от лукавого, хотя когда писал на java тоже приходилось такое лобать. Но сейчас понимаю что нету ни одной причины, которая могла бы оправдать их написание.
Если ты готов попробовать пораскинуть мозгами и понять как делать правильно - то прочитай следующее внимательно -
1) Перед тем как тестировать этот код, его надо отрефакторить. Тесты, в том числе нужны для того, чтобы понять какие зависимости есть в коде, как его вызывает сторонний код и как его сделать правильнее\удобнее
2) Старайся делать свои функции "чистыми", то есть у тебя строго сконструированные входные параметры(не контексты, энвайрнменты, вебсессии и прочяя хрень, а строка, число, объект юзер , объект темплейт и т.д), у тебя выход функции должен зависеть только от входа и всегда давать один и тот же выход(при тех же входных параметров), то есть никаких зависимостей от внешнего мира и пробрасывания эксепшенов.
3) Все действия с контекстами, сессиями, коннекшенами и т.д, всем тем что хранит состояние внешнего мира тебе надо вынести на уровень выше, в код-обвязку, которая не тестируется юнит-тестами, а тестируется интеграционными.
4) В таком случае тебе останется протестировать бизнес лошику - ты передаешь в функцию объект, а она на основе объекта что-то делает и никакой свистопляски с контекстом.
5) Иногда, особенно в Java мире абстракцию делают на основе интерфейса, это тоже вариант. То есть ты можешь переписать код чтобы он принимал интерфейс IContext, в реальном приложеии это будет реальный обхект, а в тесте моковый. Так тоже можно, но я предпочитаю все же чистые функции

Ты конечно можешь продолжать ныть, что мол код уже написан, мое дело малое и тд - ну так какого ты ответа тогда ждешь? Либо колупайся сам дальше в говне, либо пойди и скажи что код говно и нетестируемый, но ты знаешь как правильно переписать, в таком случае поможем и подскажем.


код говно - я с этим согласен
это 2009 год и тут некое подобие самописного spring
тоесть тут тоже есть контекст,а вместо бинов есть своя замена - все это функционирует посредством сборной солянки из груви джавы и хмл- но это бог с ним

ты пишешь про состояния-у нас их нет - насколько я понял тут все крутиться на stateless - но это насколько я понял

ты пишешь верные вещи- но тут нужно будет перепесивать целиком все от а до я тогда и пока это не моего уровня знания вещи.

но я так понимаю что в текущем варианте мне этот метод не оттестировать?
25 июл 20, 14:11    [22173559]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
mayton
Member

Откуда: loopback
Сообщений: 47971
Надо свести тест к вызову одной функции myFuckenBusinessLogic(..)

assertEquals(testDataItemModel.get("GROUP_CODE"), myFuckenBusinessLogic(...));


А все эти моки - признак плохого дизайна. Собственно моки нужны там где исходников нет и надо закрыть
какой-то объект имеющий специфичное поведение и такое что никак обычной логикой не добиться.

В остальных случаях - бери и кромсай код чтобы сделать его testable.
25 июл 20, 14:19    [22173562]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
mayton
Надо свести тест к вызову одной функции myFuckenBusinessLogic(..)

assertEquals(testDataItemModel.get("GROUP_CODE"), myFuckenBusinessLogic(...));


А все эти моки - признак плохого дизайна. Собственно моки нужны там где исходников нет и надо закрыть
какой-то объект имеющий специфичное поведение и такое что никак обычной логикой не добиться.

В остальных случаях - бери и кромсай код чтобы сделать его testable.

давай попробуем свести к одной функции

вот сам метод
	public static IDictionary dic(OperationContext context) {
		byte[] fileData = (byte[]) context.getProperties().getObjectRaise("FILEDATA");


		TemplateGroup[] templates = new TemplateGroup[0];
		try {
			templates = new ObjectMapper().readValue(fileData, TemplateGroup[].class);
		} catch (IOException e) {

		}
		[SRC JAVA]IDictionary dic = Context.newDictionary("doc_maker/doc/template_group");


Arrays.stream(templates).forEach(item -> {
IDataItemModel record = dic.getNewDataRecord();
record.set("GROUP_CODE", item.getGroupCode());
record.set("GROUP_NAME", item.getGroupName());
record.set("GROUP_DESCRIPTION", item.getGroupDescription());
record.set("GROUP_ORDER", item.getGroupOrder());
}
);
return dic;
}[/SRC]

что тут происходит -
1.из контекста берется некий объект приводится к байт массиву
2.байт массив преобразуется в объект нужного нам класса с момощью мапера
3.далее мы берем другой контекст и пишем рекод в кэш( но я не уверен что это так) и присваем рекорду значения полей
4.возвращаем справочник

все что мне надо проверить что если я где то положу такой же файлик - чтобы оно в методе обработалось и вернуло мне ожидаемую запись

звучит легко - на самом деле нет - так как я вроде все поборол но не могу поборот NullPointer вот в этой сточке
IDictionary dic = Context.newDictionary("doc_maker/doc/template_group");

когда тест деграет метод dic - и доходит до этой точки - то валится так как я так понимаю Context пустой
я попробовал и его мокнуть вот так
when(context1.newDictionary("doc_maker/doc/template_group")).thenReturn(new IDictionary() {
			@Override
			public IDataItemModel getCopyDataObject(IDataItemModel dataObj) {
				return null;
			}

			@Override
			public IDataItemModel getCopyDataObject(IDataItemModel dataObj, boolean ignoreDefCanCopy) {
				return null;
			}

			@Override
			public String getVersion() {
				return null;
			}

			@Override
			public MetaDataSet getMetaData() {
				return null;
			}

			@Override
			public Connection getConnection() {
				return null;
			}

			@Override
			public CoverRecordSet getCoverRecordSet() {
				return null;
			}

			@Override
			public boolean isLoaded() {
				return false;
			}

			@Override
			public IRecordSet getRecordSet() {
				return null;
			}

			@Override
			public IDataItemModel getDataItem(String key) {
				return null;
			}

			@Override
			public IDataItemModel getDataItem(Connection connection, String key) {
				return null;
			}

			@Override
			public IDataItemModel getDataItemRaise(Connection connection, String key) {
				return null;
			}

			@Override
			public IDataItemModel getDataItemRaise(String key) {
				return null;
			}

			@Override
			public IDataItemModel recordByAlternativeKey(CusterpProperties primaryKeyMap, IDataReaderModel dataObj) {
				return null;
			}

			@Override
			public IDataItemModel recordByAlternativeKey(ForeignKey key, IDataReaderModel dataObj) {
				return null;
			}

			@Override
			public IDataItemModel getDataItem(IPropertiesReader primaryKeyMap, IDataReaderModel dataObj) {
				return null;
			}

			@Override
			public IDataItemModel getDataItem(ForeignKey foreignKey, IDataReaderModel dataObj) {
				return null;
			}

			@Override
			public void fillValues(CusterpProperties primaryKeyMap, IDataItemModel dataObj, IDataItemModel selObj) {

			}

			@Override
			public ErpOrderList getOrderList() {
				return null;
			}

			@Override
			public void updateListeners(String reasonItemKey) {

			}

			@Override
			public void updateListener(SelectContext selectContext) {

			}

			@Override
			public boolean hasForm(String formType) {
				return false;
			}

			@Override
			public boolean isFormAvailable(String formType) {
				return false;
			}

			@Override
			public Component getListForm(String formType, IPropertiesReader prop) {
				return null;
			}

			@Override
			public Component getListForm(CusterpProperties prop) {
				return null;
			}

			@Override
			public Component getListForm(String formType) {
				return null;
			}

			@Override
			public Component getListForm() {
				return null;
			}

			@Override
			public Component getSelectForm(String formType, boolean isModal, boolean multySelect, boolean readOnly, KeySet selected) {
				return null;
			}

			@Override
			public Component getSelectForm(String formType, boolean multySelect, boolean readOnly, IDataItemModel dataObj) {
				return null;
			}

			@Override
			public Component createEditorForm(String formType, CustomController controller, DataItemGetter itemGetter, boolean isModal) {
				return null;
			}

			@Override
			public Component createEditorForm(String formType, CustomController controller, IDataItemModel item, boolean isModal) {
				return null;
			}

			@Override
			public Component createEditorForm(String formType, CustomController controller, DataItemGetter itemGetter) {
				return null;
			}

			@Override
			public Component createEditorForm(String formType, CustomController controller, IDataItemModel item, CusterpProperties prop) {
				return null;
			}

			@Override
			public Component createEditorForm(String[] formTypes, CustomController controller, DataItemGetter itemGetter, CusterpProperties prop) {
				return null;
			}

			@Override
			public Component createEditorForm(String formType, CustomController controller, DataItemGetter itemGetter, CusterpProperties prop) {
				return null;
			}

			@Override
			public void registerEditor(IWidgetData editor) {

			}

			@Override
			public void removeEditor(IWidgetData editor) {

			}

			@Override
			public List<IWidgetData> getEditors() {
				return null;
			}

			@Override
			public void setMaxRecordCount(int maxRecordCount) {

			}

			@Override
			public void setDefaultValues(CusterpProperties defaultValues) {

			}

			@Override
			public void setEmptyDefaultValues(CusterpProperties defaultValues) {

			}

			@Override
			public void sortModel(SelectContext selectContext) {

			}

			@Override
			public FilterList getFilterList() {
				return null;
			}

			@Override
			public FilterList addFilter(String filterName, IFilterNode node) {
				return null;
			}

			@Override
			public FilterList addFilter(String filterName, String expression) {
				return null;
			}

			@Override
			public FilterList addFilter(String filterName, String expression, IReaderBinding binding) {
				return null;
			}

			@Override
			public FilterList addFilter(String filterName, FilterExpression filterExpression) {
				return null;
			}

			@Override
			public FilterList addFilter(String filterName, FilterNodeStorage storage) {
				return null;
			}

			@Override
			public FilterList addFilter(String filterName, String expression, Object... params) {
				return null;
			}

			@Override
			public FilterList addPrimaryKeyFilter(IReaderBinding binding) {
				return null;
			}

			@Override
			public FilterList addPrimaryKeyFilter(IReaderBinding binding, boolean isNotOperation) {
				return null;
			}

			@Override
			public FilterList addForeignKeyFilter(IReaderBinding binding) {
				return null;
			}

			@Override
			public FilterList addForeignKeyFilter(IReaderBinding binding, CusterpProperties foreignTask) {
				return null;
			}

			@Override
			public FilterList addForeignKeyFilter(IReaderBinding binding, String[] fieldNames) {
				return null;
			}

			@Override
			public FilterList removeFilter(String filterName) {
				return null;
			}

			@Override
			public boolean isEmpty() {
				return false;
			}

			@Override
			public void cancel(SelectContext selectContext) {

			}

			@Override
			public int getSize() {
				return 0;
			}

			@Override
			public IDataItemModel getFirstItem() {
				return null;
			}

			@Override
			public IDataItemModel getNewDataRecord() {
				return testDataItemModel;
			}

			@Override
			public IDataItemModel getNewDataRecord(IDataItemModel itemModel) {
				return null;
			}

			@Override
			public ControlNode getControlNode(String name) {
				return null;
			}

			@Override
			public ControlNode getControlNode() {
				return null;
			}

			@Override
			public void setAllBind(boolean bindFlag) {

			}

			@Override
			public void setBind(String bindedFields, boolean bindFlag) {

			}

			@Override
			public void setBind(IFieldNames bindedFields, boolean bindFlag) {

			}

			@Override
			public void setBind(String bindedFields) {

			}

			@Override
			public void setBind(IFieldNames bindedFields) {

			}

			@Override
			public void setAllBind() {

			}

			@Override
			public void post() {

			}

			@Override
			public void post(Connection connection) {

			}

			@Override
			public void commitPost() {

			}

			@Override
			public int getFrameSize() {
				return 0;
			}

			@Override
			public void setFrameSize(int size) {

			}

			@Override
			public void setAutoRefresh(boolean autoRefresh) {

			}

			@Override
			public boolean isAutoRefresh() {
				return false;
			}

			@Override
			public DbTypes.DbType getDbType() {
				return null;
			}

			@Override
			public String getDataBaseName() {
				return null;
			}

			@Override
			public boolean deleteData(SelectContext selectContext) {
				return false;
			}

			@Override
			public boolean insertData(SelectContext selectContext) {
				return false;
			}

			@Override
			public IDataItemModel getEmptyDataObject() {
				return null;
			}

			@Override
			public IDataItemModel getEmptyDataObject(IDataItemModel itemModel) {
				return null;
			}

			@Override
			public boolean moveDown(SelectContext selectContext) {
				return false;
			}

			@Override
			public boolean moveUp(SelectContext selectContext) {
				return false;
			}

			@Override
			public boolean updateData(SelectContext selectContext) {
				return false;
			}

			@Override
			public CusterpMetadataLocator getLocator() {
				return null;
			}

			@Override
			public String getCaption() {
				return null;
			}

			@Override
			public String getName() {
				return null;
			}

			@Override
			public void refreshModel() {

			}

			@Override
			public void refreshModel(SelectContext selectContext) {

			}

			@Override
			public void refreshModel(Connection connection) {

			}

			@Override
			public void refreshModel(Connection connection, SelectContext selectContext) {

			}

			@Override
			public void registerListener(IModelListener listener, ErpOrderList orderList, boolean needRefresh) {

			}

			@Override
			public void setOrderList(ErpOrderList orderList) {

			}

			@Override
			public Iterator<DataRecord> iterator() {
				return null;
			}
		});
25 июл 20, 14:29    [22173565]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
с помощью вызова анонимного класса и возвращать то что нам надо
но все равно получаю
nullpointer
25 июл 20, 14:31    [22173566]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
тут даже фиг с этой архитектурой и прочим

я хочу сделать банальную вещь - взять и мокнуть Context
и далее в тесте написать
что то типо
when(contexts.newDictionary("doc_maker/doc/template_group")).thenReturn((IDictionary) testDataItemModel);

я получаю тут нульпоинтер ,почему то этот контекст не хочет мокаться - судя по всему изза того что он синглтон или я хз

вообщем банальный мок тест я пишу уже 3й день,так как гребаный контекст не хочет мокнуться
25 июл 20, 16:35    [22173597]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
mayton
Member

Откуда: loopback
Сообщений: 47971
Я не понимаю. Тест должен закреплять бизнес-логику. Не интерфейсы. Не моки. Не какие-то грёбаные геттеры.

Ты можешь желтым маркером отметить в исходнике где у тебя бизнес-логика?

Я убежден что ее там всего 3-5 строк.
25 июл 20, 16:50    [22173602]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
Вообщем все понятно- синглтон не тестится - для этого нужны специальные инструменты типо POWER MOCK
25 июл 20, 16:52    [22173604]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
mayton
Я не понимаю. Тест должен закреплять бизнес-логику. Не интерфейсы. Не моки. Не какие-то грёбаные геттеры.

Ты можешь желтым маркером отметить в исходнике где у тебя бизнес-логика?

Я убежден что ее там всего 3-5 строк.


	byte[] fileData = (byte[]) context.getProperties().getObjectRaise("FILEDATA");


		TemplateGroup[] templates = new TemplateGroup[0];
		try {
			templates = new ObjectMapper().readValue(fileData, TemplateGroup[].class);
		} catch (IOException e) {

		}
		IDictionary dic = Context.newDictionary("doc_maker/doc/template_group");


Arrays.stream(templates).forEach(item -> {
IDataItemModel record = dic.getNewDataRecord();
record.set("GROUP_CODE", item.getGroupCode());
record.set("GROUP_NAME", item.getGroupName());
record.set("GROUP_DESCRIPTION", item.getGroupDescription());
record.set("GROUP_ORDER", item.getGroupOrder())

сам метод - безнес логики тут мало - перемапить 4 поля из обьекта в рекорд

но чтобы протестить этот метод я должен мокнуть контекст( У КОТОРОГО НЕТ ДЕФОЛТ КОНСТРУКТОРА) в котором лежит искходный файл в виде байт массива
и мокнуть синглтон Context
чтобы протестировать сию бизнес логику

по сему тут либо код исходный переделывать только

я вижу такой варинт - синглтон мне все равно уже не мокнуть никак- я там 100%получу нульпоинтер
значит надо исходный метод разбить на несколько чтобы бизнес логика было отлеьно от контекстов
25 июл 20, 17:59    [22173613]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
тут вообщем два контекста)
один синглтон ,второй без дефолт конструкторов
я думаю я таки найду выход- разделением логики + контекста
25 июл 20, 18:02    [22173614]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
суть самого теста проверить что из шаблона который я загружаю- создаться нужный мне обьект - тоесть ну такое себе ,профита практически 0,зато пришлось пару дней репу чесать чтобы осознать все что надо

ну и вообще вот тесты такие это плохо- на самом деле норм- ведь я по сути сейчас TDD сделаю
по тесту буду писать код
так что все норм,за исключением того ,что это жутчайший легаси

насколько я помню мы на другой работе с junit 5 тестили и мокали все что хотели
25 июл 20, 18:15    [22173615]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
mayton
Member

Откуда: loopback
Сообщений: 47971
По сути это тест конвертера. Только конвертер у тебя - ужасен.

Нет конструктора - добавь конструктор. Это будет легче чем городить огород из моков.
25 июл 20, 20:04    [22173638]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
mayton
По сути это тест конвертера. Только конвертер у тебя - ужасен.

Нет конструктора - добавь конструктор. Это будет легче чем городить огород из моков.

код не мой- это я преобразовал скрипт из груви в джаву)

что ты имеешь ввиду про контсруктор
добавить поля контекстные в класс ?

Сообщение было отредактировано: 25 июл 20, 20:08
25 июл 20, 20:09    [22173641]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
mayton
А что будет потом с байтами? Они же бесполезны для работы по JSon технологиям. Надо будет обратныть его разворачивать.

А тогда зачем заворачивать?

грузим с файловой системы шаблон- он в формате джейсон
стандартыми ObjectMapper преоразуем в объект нужного класса
записываем в кэш новый рекорд и мапим на него поля из джейсона
25 июл 20, 20:21    [22173643]     Ответить | Цитировать Сообщить модератору
 Re: JSON to byte array  [new]
Zzz79
Member

Откуда:
Сообщений: 569
Чего то я запутался вообще в край,голова кипит

вот у меня есть где то в директории json file я хочу его превратить в объект причем не какой то а просто Object

делаю стандартные манипуляции с чтением файла и получаю ошибку

java.io.StreamCorruptedException: invalid stream header: 5B0D0A20

File file=new File("src\\test\\resources\\com\\custsystems\\dictionary\\docMaker\\document\\template_group.json");
		FileInputStream fileInputStream=new FileInputStream(file);
		ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
		Object o=objectInputStream.readObject();



это вроде как говорит что читать файл нужно так же как ты его туда записал.....
тоесть если я его туда руками положил то теперь выхода нет?что за дичь то
27 июл 20, 09:37    [22174027]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить