/* * Copyright 2012-2017 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. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.boot.test.autoconfigure.orm.jpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.PersistenceUnitUtil; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.orm.jpa.EntityManagerHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.verify; /** * Tests for {@link TestEntityManager}. * * @author Phillip Webb */ public class TestEntityManagerTests { @Rule public ExpectedException thrown = ExpectedException.none(); @Mock private EntityManagerFactory entityManagerFactory; @Mock private EntityManager entityManager; @Mock private PersistenceUnitUtil persistenceUnitUtil; private TestEntityManager testEntityManager; @Before public void setup() { MockitoAnnotations.initMocks(this); this.testEntityManager = new TestEntityManager(this.entityManagerFactory); given(this.entityManagerFactory.getPersistenceUnitUtil()) .willReturn(this.persistenceUnitUtil); } @Test public void createWhenEntityManagerIsNullShouldThrowException() throws Exception { this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("EntityManagerFactory must not be null"); new TestEntityManager(null); } @Test public void persistAndGetIdShouldPersistAndGetId() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); given(this.persistenceUnitUtil.getIdentifier(entity)).willReturn(123); Object result = this.testEntityManager.persistAndGetId(entity); verify(this.entityManager).persist(entity); assertThat(result).isEqualTo(123); } @Test public void persistAndGetIdForTypeShouldPersistAndGetId() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); given(this.persistenceUnitUtil.getIdentifier(entity)).willReturn(123); Integer result = this.testEntityManager.persistAndGetId(entity, Integer.class); verify(this.entityManager).persist(entity); assertThat(result).isEqualTo(123); } @Test public void persistShouldPersist() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); TestEntity result = this.testEntityManager.persist(entity); verify(this.entityManager).persist(entity); assertThat(result).isSameAs(entity); } @Test public void persistAndFlushShouldPersistAndFlush() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); TestEntity result = this.testEntityManager.persistAndFlush(entity); verify(this.entityManager).persist(entity); verify(this.entityManager).flush(); assertThat(result).isSameAs(entity); } @Test public void persistFlushFindShouldPersistAndFlushAndFind() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); TestEntity found = new TestEntity(); given(this.persistenceUnitUtil.getIdentifier(entity)).willReturn(123); given(this.entityManager.find(TestEntity.class, 123)).willReturn(found); TestEntity result = this.testEntityManager.persistFlushFind(entity); verify(this.entityManager).persist(entity); verify(this.entityManager).flush(); assertThat(result).isSameAs(found); } @Test public void mergeShouldMerge() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); given(this.entityManager.merge(entity)).willReturn(entity); TestEntity result = this.testEntityManager.merge(entity); verify(this.entityManager).merge(entity); assertThat(result).isSameAs(entity); } @Test public void removeShouldRemove() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); this.testEntityManager.remove(entity); verify(this.entityManager).remove(entity); } @Test public void findShouldFind() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); given(this.entityManager.find(TestEntity.class, 123)).willReturn(entity); TestEntity result = this.testEntityManager.find(TestEntity.class, 123); assertThat(result).isSameAs(entity); } @Test public void flushShouldFlush() throws Exception { bindEntityManager(); this.testEntityManager.flush(); verify(this.entityManager).flush(); } @Test public void refreshShouldRefresh() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); this.testEntityManager.refresh(entity); verify(this.entityManager).refresh(entity); } @Test public void clearShouldClear() throws Exception { bindEntityManager(); this.testEntityManager.clear(); verify(this.entityManager).clear(); } @Test public void detachShouldDetach() throws Exception { bindEntityManager(); TestEntity entity = new TestEntity(); this.testEntityManager.detach(entity); verify(this.entityManager).detach(entity); } @Test public void getIdForTypeShouldGetId() throws Exception { TestEntity entity = new TestEntity(); given(this.persistenceUnitUtil.getIdentifier(entity)).willReturn(123); Integer result = this.testEntityManager.getId(entity, Integer.class); assertThat(result).isEqualTo(123); } @Test public void getIdForTypeWhenTypeIsWrongShouldThrowException() throws Exception { TestEntity entity = new TestEntity(); given(this.persistenceUnitUtil.getIdentifier(entity)).willReturn(123); this.thrown.expectMessage("ID mismatch: Object of class [java.lang.Integer] " + "must be an instance of class java.lang.Long"); this.testEntityManager.getId(entity, Long.class); } @Test public void getIdShouldGetId() throws Exception { TestEntity entity = new TestEntity(); given(this.persistenceUnitUtil.getIdentifier(entity)).willReturn(123); Object result = this.testEntityManager.getId(entity); assertThat(result).isEqualTo(123); } @Test public void getEntityManagerShouldGetEntityManager() throws Exception { bindEntityManager(); assertThat(this.testEntityManager.getEntityManager()) .isEqualTo(this.entityManager); } @Test public void getEntityManagerWhenNotSetShouldThrowException() throws Exception { this.thrown.expect(IllegalStateException.class); this.thrown.expectMessage("No transactional EntityManager found"); this.testEntityManager.getEntityManager(); } private void bindEntityManager() { EntityManagerHolder holder = new EntityManagerHolder(this.entityManager); TransactionSynchronizationManager.bindResource(this.entityManagerFactory, holder); } static class TestEntity { } }