DATAJPA-523 - Make Specifications implement Serializable.
Specifications now implements Serializable to be able to transfer them across systems boundaries. Introduced special Serializable Specification types for composed and negated Specifications. Note that currently only Hibernate and EclipseLink expression structures implement Serializable - OpenJPA's don't. Original pull request: #86.
This commit is contained in:
committed by
Oliver Gierke
parent
3590075a46
commit
47b4d8a3c3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2013 the original author or authors.
|
||||
* Copyright 2013-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -19,6 +19,9 @@ import static org.hamcrest.CoreMatchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
import static org.springframework.data.jpa.domain.Specifications.*;
|
||||
import static org.springframework.util.SerializationUtils.*;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
@@ -33,24 +36,24 @@ import org.mockito.runners.MockitoJUnitRunner;
|
||||
|
||||
/**
|
||||
* @author Oliver Gierke
|
||||
* @author Thomas Darimont
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class SpecificationsUnitTests {
|
||||
|
||||
@Mock
|
||||
Specification<Object> mockSpec;
|
||||
@Mock
|
||||
Root<Object> root;
|
||||
@Mock
|
||||
CriteriaQuery<?> query;
|
||||
@Mock
|
||||
CriteriaBuilder builder;
|
||||
@Mock(extraInterfaces = Serializable.class) Root<Object> root;
|
||||
@Mock(extraInterfaces = Serializable.class) CriteriaQuery<?> query;
|
||||
@Mock(extraInterfaces = Serializable.class) CriteriaBuilder builder;
|
||||
|
||||
@Mock
|
||||
Predicate predicate;
|
||||
@Mock(extraInterfaces = Serializable.class) Predicate predicate;
|
||||
|
||||
@Before
|
||||
@SuppressWarnings("unchecked")
|
||||
public void setUp() {
|
||||
|
||||
mockSpec = (Specification<Object>) mock(Specification.class, withSettings().serializable());
|
||||
|
||||
when(mockSpec.toPredicate(root, query, builder)).thenReturn(predicate);
|
||||
}
|
||||
|
||||
@@ -128,4 +131,39 @@ public class SpecificationsUnitTests {
|
||||
assertThat(specification, is(notNullValue()));
|
||||
assertThat(specification.toPredicate(root, query, builder), is(predicate));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAJPA-523
|
||||
*/
|
||||
@Test
|
||||
public void specificationsShouldBeSerializable() {
|
||||
|
||||
Specifications<Object> specification = where(mockSpec);
|
||||
specification = specification.and(mockSpec);
|
||||
|
||||
assertThat(specification, is(notNullValue()));
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Specifications<Object> transferedSpecification = (Specifications<Object>) deserialize(serialize(specification));
|
||||
|
||||
assertThat(transferedSpecification, is(notNullValue()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAJPA-523
|
||||
*/
|
||||
@Test
|
||||
public void complexSpecificationsShouldBeSerializable() {
|
||||
|
||||
Specifications<Object> specification = where(mockSpec);
|
||||
specification = Specifications.not(specification.and(mockSpec).or(mockSpec));
|
||||
|
||||
assertThat(specification, is(notNullValue()));
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
Specifications<Object> transferedSpecification = (Specifications<Object>) deserialize(serialize(specification));
|
||||
|
||||
assertThat(transferedSpecification, is(notNullValue()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user