Поле идентификатора не устанавливается при чтении из фонго с использованием spring-data-monogdb во время модульных тестов

У меня следующая проблема: у меня есть приложение spring-boot (1.3.3), которое использует mongodb в качестве хранилища. Все отлично работает с настоящим mongodb, используя репозитории mongo. Но для модульных тестов мы пытаемся использовать fongo, чтобы не устанавливать mongodb на каждый сервер. Большинство тестов также отлично работают с фонго, но когда я загружаю объект из базы данных (фонго), поле с идентификатором не устанавливается. Кто-нибудь еще испытал подобное? Заранее спасибо за вашу помощь!

Документ:

@Document
public class SystemEvent {

    @Id
    private String id;

    private String oid;

    private String description;

    private String type;

    private String severtity;

    public SystemEvent(){
    }

    // getter/setter

}

Репозиторий:

@Repository
public interface SystemEventRepository extends MongoRepository<SystemEvent, String> {

}

Тест:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MongoFongoApplication.class)
public class MongoFongoApplicationTests {

    @Test
    public void contextLoads() {
    }

    @Autowired
    SystemEventRepository systemEventRepository;

    @Test
    public void testRepo() {
        SystemEvent info1 = systemEventRepository.save(new SystemEvent("DESC 1", "TYPE 1", "INFO"));
        SystemEvent info2 = systemEventRepository.save(new SystemEvent("DESC 2", "TYPE 2", "INFO"));
        List<SystemEvent> all = systemEventRepository.findAll();

        assertThat(all.size(), is(2)); // WORKS FINE

        // -----

        SystemEvent systemEvent = systemEventRepository.findOne(info1.getId());

        assertThat(systemEvent, notNullValue());  // WORKS FINE
        assertThat(systemEvent.getId(), notNullValue()); // FAILS
    }

    @Configuration
    public static class TestConfig extends AbstractMongoConfiguration {
        @Override
        protected String getDatabaseName() {
            return "test";
        }

        @Override
        public Mongo mongo() throws Exception {
            return new Fongo(getDatabaseName()).getMongo();
        }
    }

}

person R. Illger    schedule 03.05.2016    source источник
comment
Кроме того, я вижу, что вы используете assertThat(systemEvent.getId(), notNullValue()); Можете ли вы попробовать использовать свой .setId(int/long <number>) value в этой строке. Я думаю, что ваш тестовый пример ожидает значение   -  person ryekayo    schedule 03.05.2016
comment
Да, кроме идентификатора поля, который нужно установить. Но я за исключением того, что идентификатор устанавливается, когда объект загружается из базы данных. С настоящим монго это работает (также этот тестовый пример). Но с фонго не получается.   -  person R. Illger    schedule 04.05.2016


Ответы (1)


Попробуйте добавить их для поля Id в классе модели документа. Это должно решить вашу проблему.

@Id
@Field(value = GdnBaseMongoEntity.ID)
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
private String id;

Для GeneratedValue вам потребуется добавить зависимость для API сохраняемости javax. вы можете добавить это в свой файл pom.xml

<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.0.Final</version>
</dependency>

Для сборки.градле

compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.0-api', version: '1.0.0.Final'
person lrathod    schedule 08.02.2018
comment
Довольно интересный ваш ответ, но извините, я не могу найти пакеты аннотаций (MongoId, GeneratedValue...)... - person Stefano Scarpanti; 31.07.2018
comment
Извини, я виноват. вам не нужно (удалили из ответа). Для GeneratedValue вам нужно будет добавить зависимость для API сохраняемости javax. Обновил мой ответ. Можете ли вы попробовать это? - person lrathod; 07.08.2018