package kr.pe.kwonnam.replicationdatasource; import kr.pe.kwonnam.replicationdatasource.config.ReplicationDataSourceApplicationConfig; import kr.pe.kwonnam.replicationdatasource.jpa.User; import kr.pe.kwonnam.replicationdatasource.jpa.UserOuterService; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = ReplicationDataSourceApplicationConfig.class) public abstract class AbstractReplicationDataSourceIntegrationTest { private Logger log = LoggerFactory.getLogger(AbstractReplicationDataSourceIntegrationTest.class); @Autowired private UserOuterService userOuterService; @Test public void findByIdRead() throws Exception { User user = userOuterService.findByIdRead(1); log.info("findByIdRead : {}", user); assertThat(user.getName()).as("readOnly=true Transaction").isEqualTo("read_1"); } @Test public void findByIdWrite() throws Exception { User user = userOuterService.findByIdWrite(3); log.info("findByIdWrite : {}", user); assertThat(user.getName()).as("readOnly=false Transaction").isEqualTo("write_3"); } @Test public void saveWrite() throws Exception { User newUser = new User(); newUser.setName("New User"); userOuterService.save(newUser); log.info("User saved : {}", newUser); User newUserFromRead = userOuterService.findByIdRead(newUser.getId()); assertThat(newUserFromRead).as("New user is saved to write db. So read db must not have the user.").isNull(); User newUserFromWrite = userOuterService.findByIdWrite(newUser.getId()); assertThat(newUserFromWrite).as("New user is saved to write db. So write db must have the user.").isNotNull().isEqualTo(newUser); } @Test public void findByIdWriteAndInnerReadWithPropagationRequired() throws Exception { Map<String, User> users = userOuterService.findByIdWriteAndInnerReadWithPropagationRequired(1, 2, 3); assertThat(users.get("outerFirstUser").getName()).as("Outer first user id 1 from write db.").isEqualTo("write_1"); assertThat(users.get("innerUser").getName()).as("Inner user id 2 from write db.").isEqualTo("write_2"); assertThat(users.get("outerSecondUser").getName()).as("Outer second user id 3 from write db.").isEqualTo("write_3"); } @Test public void findByIdWriteAndInnerReadWithPropagationRequiresNew() throws Exception { Map<String, User> users = userOuterService.findByIdWriteAndInnerReadWithPropagationRequiresNew(3, 1, 3); assertThat(users.get("outerFirstUser").getName()).as("Outer first user id 1 from write db.").isEqualTo("write_3"); assertThat(users.get("innerUser").getName()).as("Inner user id 2 from write db.").isEqualTo("read_1"); assertThat(users.get("outerSecondUser").getName()).as("Outer second user id 3 from write db.").isEqualTo("write_3"); } @Test public void findByIdWriteAndInnerReadWithPoropagationMandatory() throws Exception { Map<String, User> users = userOuterService.findByIdWriteAndInnerReadWithPoropagationMandatory(2, 3, 1); assertThat(users.get("outerFirstUser").getName()).as("Outer first user id 1 from write db.").isEqualTo("write_2"); assertThat(users.get("innerUser").getName()).as("Inner user id 2 from write db.").isEqualTo("write_3"); assertThat(users.get("outerSecondUser").getName()).as("Outer second user id 3 from write db.").isEqualTo("write_1"); } }