/** * Copyright 2009-2016 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.apache.ibatis.type; import org.apache.ibatis.BaseDataTest; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.TransactionFactory; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mock; import javax.sql.DataSource; import java.io.*; import java.sql.Clob; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** * Tests for {@link ClobReaderTypeHandler}. * * @since 3.4.0 * @author Kazuki Shimizu */ public class ClobReaderTypeHandlerTest extends BaseTypeHandlerTest { private static final TypeHandler<Reader> TYPE_HANDLER = new ClobReaderTypeHandler(); private static SqlSessionFactory sqlSessionFactory; @Mock protected Clob clob; @BeforeClass public static void setupSqlSessionFactory() throws Exception { DataSource dataSource = BaseDataTest.createUnpooledDataSource("org/apache/ibatis/type/jdbc.properties"); BaseDataTest.runScript(dataSource, "org/apache/ibatis/type/ClobReaderTypeHandlerTest.sql"); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("Production", transactionFactory, dataSource); Configuration configuration = new Configuration(environment); configuration.addMapper(Mapper.class); sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); } @Override @Test public void shouldSetParameter() throws Exception { Reader reader = new StringReader("Hello"); TYPE_HANDLER.setParameter(ps, 1, reader, null); verify(ps).setClob(1, reader); } @Override @Test public void shouldGetResultFromResultSetByName() throws Exception { Reader reader = new StringReader("Hello"); when(rs.getClob("column")).thenReturn(clob); when(rs.wasNull()).thenReturn(false); when(clob.getCharacterStream()).thenReturn(reader); assertEquals(reader, TYPE_HANDLER.getResult(rs, "column")); } @Override @Test public void shouldGetResultNullFromResultSetByName() throws Exception { when(rs.getClob("column")).thenReturn(null); when(rs.wasNull()).thenReturn(true); assertNull(TYPE_HANDLER.getResult(rs, "column")); } @Override @Test public void shouldGetResultFromResultSetByPosition() throws Exception { when(rs.getClob(1)).thenReturn(clob); when(rs.wasNull()).thenReturn(true); assertNull(TYPE_HANDLER.getResult(rs, 1)); } @Override @Test public void shouldGetResultNullFromResultSetByPosition() throws Exception { when(rs.getClob(1)).thenReturn(null); when(rs.wasNull()).thenReturn(true); assertNull(TYPE_HANDLER.getResult(rs, 1)); } @Override @Test public void shouldGetResultFromCallableStatement() throws Exception { Reader reader = new StringReader("Hello"); when(cs.getClob(1)).thenReturn(clob); when(cs.wasNull()).thenReturn(false); when(clob.getCharacterStream()).thenReturn(reader); assertEquals(reader, TYPE_HANDLER.getResult(cs, 1)); } @Override @Test public void shouldGetResultNullFromCallableStatement() throws Exception { when(cs.getClob(1)).thenReturn(null); when(cs.wasNull()).thenReturn(true); assertNull(TYPE_HANDLER.getResult(cs, 1)); } @Test public void integrationTest() throws IOException { SqlSession session = sqlSessionFactory.openSession(); try { Mapper mapper = session.getMapper(Mapper.class); // insert (Reader -> Clob) { ClobContent clobContent = new ClobContent(); clobContent.setId(1); clobContent.setContent(new StringReader("Hello")); mapper.insert(clobContent); session.commit(); } // select (Clob -> Reader) { ClobContent clobContent = mapper.findOne(1); assertThat(new BufferedReader(clobContent.getContent()).readLine()).isEqualTo("Hello"); } } finally { session.close(); } } interface Mapper { @Select("SELECT ID, CONTENT FROM TEST_CLOB WHERE ID = #{id}") ClobContent findOne(int id); @Insert("INSERT INTO TEST_CLOB (ID, CONTENT) VALUES(#{id}, #{content})") void insert(ClobContent blobContent); } static class ClobContent { private int id; private Reader content; public int getId() { return id; } public void setId(int id) { this.id = id; } public Reader getContent() { return content; } public void setContent(Reader content) { this.content = content; } } }