Архив метки: java

Gson, java. Forgot to register a type adapter?

Данная ошибка возникает когда библиотека gson не может конвертировать объект не простого типа в json. Например когда мы напрямую вызываем:

    GsonBuilder gsonBuilder = new GsonBuilder();
    Gson gson = gsonBuilder.create();
    return gson.toJson(myMegaObj);

В данном случае необходимо вручную указать каким образом будет сконвертирован объект myMegaObj путем создания класса сериалайзера. В данной заметке мы покажем как избавиться от ошибки в заголовке и создадим простой адаптер для преобразования объекта в json. Для этого зарегистрируем адаптер, до метода toJson

public static String getJsonString(MyMegaObj myMegaObj){
    GsonBuilder gsonBuilder = new GsonBuilder();
    //регистрация адаптеров
    gsonBuilder.registerTypeAdapter(MyMegaObj.class, new MyMegaObjSerializer());
    gsonBuilder.registerTypeAdapter(MyObj.class, new MyObjSerializer());

    Gson gson = gsonBuilder.create();
    return gson.toJson(myMegaObj);
}

А теперь реализуем адаптер.

public class MyMegaObjSerializer implements JsonSerializer {
    @Override
    public JsonObject serialize(MyMegaObj myMegaObj, Type type, JsonSerializationContext context) {
        JsonObject result = new JsonObject();
        JsonObject fields = new JsonObject();

        //fields
        result.add("fields", fields);
        for (Map.Entry fieldEntry : myMegaObj.getFields().entrySet()) {
            fields.add(fieldEntry.getKey(), context.serialize(fieldEntry.getValue()));
        }

        return result;
    }
}

Простой пример использования JUnit 4.11 Создаем первые тесты с аннотацией @After @Before

В заметки рассмотрим как создать тесты для модульного тестирования с помощью JUnit на java с нуля. Проще всего создать новый maven проект, в зависимости добавляем JUnit, как это показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jjj</groupId>
    <artifactId>jjj</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

далее сделав maven install (я использую idea) создаем самые простые тесты в package /src/test/java/tests
(у вас может быть другой package) . Сравнение значений происходит с помощью функций assert*

package tests;

import TestWrapper;
import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Created by sbt-zabaykin-av on 29/09/2015.
 */
public class Test_01 extends TestWrapper {
    @Test
    public void test_1(){
        String functionName = new Object(){}.getClass().getEnclosingMethod().getName();
        System.out.println( functionName );
        assertEquals("aaa", "aaa");
    }

    @Test
    public void test_2(){
        String functionName = new Object(){}.getClass().getEnclosingMethod().getName();
        System.out.println( functionName );
        assertTrue(true);
    }
}

Как видите, мы унаследовались от класса TestWrapper и это не спроста. В данном примере мы хотим сделать специальные функции, которые будут срабатывать до теста и после теста (before\after test), а также для всех тестов в классе TEST_01 и после всех тестов в данном классе (beforeClass\afterClass). Для данной цели следует использовать аннотацию JUnit @Before, @After, @BeforeClass, @AfterClass. Для наглядности пример делает вывод System.out с названием текущей функции. После запуска вы увидите в каком порядке запускались все методы.

package tests;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
public class TestWrapper {

    @BeforeClass
    public static void beforeAllTests(){
        String functionName = new Object(){}.getClass().getEnclosingMethod().getName();
        System.out.println( "***" + functionName );
    }

    @Before
    public void beforeSimple(){
        String functionName = new Object(){}.getClass().getEnclosingMethod().getName();
        System.out.println( functionName );
    }

    @AfterClass
    public static void afterAllTests(){
        String functionName = new Object(){}.getClass().getEnclosingMethod().getName();
        System.out.println( "***" + functionName );
    }

    @After
    public void afterSimple(){
        String functionName = new Object(){}.getClass().getEnclosingMethod().getName();
        System.out.println( functionName );
    }
}

Таким образом вы можете использовать JUnit для ваших тестов. Хочется отметить, что к сожалению у JUnit нет возможности запускать метод перед всеми тестовыми классами и после всех тестовых классов.