СериализацияException на тесте junit - PullRequest
0 голосов
/ 23 октября 2018

У меня есть следующие классы:

import lombok.Data;

import java.io.Serializable;

@Data
public class Person implements Serializable {
    private String age;
}

Основное приложение

import org.apache.commons.lang3.SerializationUtils;

public class MainApp {
    public static void main(String[] args) {
        Person v = new Person() {{
            setAge("SD");
        }};
        Person person2 = SerializationUtils.clone(v);
    }
}

Тестовый класс

import org.apache.commons.lang3.SerializationUtils;
import org.junit.Test;

public class TestClass {
    @Test
    public void test() {
        Person v = new Person() {{
            setAge("SD");
        }};
        Person person2 = SerializationUtils.clone(v);
    }
}

В основном приложенииСериализация работает, а в модульном тесте - нет.Он генерирует исключение SerializationException со следующими деталями: org.apache.commons.lang3.SerializationException: java.io.NotSerializableException: com.mypackage.TestClass

Я использую intellij, и проект является проектом maven, и тесты выполняютсяJUnit4.версия зависимости:

  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.3.2</version>
  </dependency>

Посоветуйте, пожалуйста, как мне ее решить?

1 Ответ

0 голосов
/ 23 октября 2018

Вы объявляете анонимный класс в тесте.

Анонимные классы в нестатических областях (в методе экземпляра, конструкторе, инициализаторе экземпляра или инициализаторе члена экземпляра) неявно заключают ссылку на включающий класс(в данном случае TestClass).

Поскольку этот класс не сериализуем, он не может быть сериализован.

Вместо этого объявите свой анонимный подкласс как статический класс.

public class TestClass {
    @Test
    public void test() {
        Person v = new TestPerson();
        Person person2 = SerializationUtils.clone(v);
    }

  static class TestPerson extends Person {
    {
      setAge("SD");
    }
  }
}

Или, лучше, не использовать двойную инициализацию , особенно если вы не понимаете проблем, связанных с сериализацией (а также других проблем):

Person v = new Person();
v.setAge("SD");
Person person2 = SerializationUtils.clone(v);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...