View Javadoc
1   /*
2    * Copyright 2002-2016 the original author or authors
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package com.github.springtestdbunit.bean;
18  
19  import static org.junit.Assert.*;
20  import static org.mockito.BDDMockito.given;
21  import static org.mockito.Mockito.*;
22  
23  import java.sql.Connection;
24  
25  import javax.sql.DataSource;
26  
27  import org.dbunit.database.DatabaseDataSourceConnection;
28  import org.dbunit.database.IDatabaseConnection;
29  import org.junit.Before;
30  import org.junit.Test;
31  import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
32  
33  /**
34   * Tests for {@link DatabaseDataSourceConnectionFactoryBean}.
35   *
36   * @author Phillip Webb
37   */
38  public class DatabaseDataSourceConnectionFactoryBeanTest {
39  
40  	private DatabaseDataSourceConnectionFactoryBean factoryBean;
41  
42  	@Before
43  	public void setup() {
44  		this.factoryBean = new DatabaseDataSourceConnectionFactoryBean();
45  	}
46  
47  	@Test
48  	public void shouldNotAllowObjectWithoutDataSet() throws Exception {
49  		try {
50  			this.factoryBean.getObject();
51  			fail();
52  		} catch (IllegalArgumentException ex) {
53  			assertEquals("The dataSource is required", ex.getMessage());
54  		}
55  	}
56  
57  	@Test
58  	public void shouldCreateDatabaseDataSourceConnection() throws Exception {
59  		DataSource dataSource = mock(DataSource.class);
60  		Connection connection = mock(Connection.class);
61  		given(dataSource.getConnection()).willReturn(connection);
62  		this.factoryBean.setDataSource(dataSource);
63  		DatabaseDataSourceConnection bean = this.factoryBean.getObject();
64  		assertNotNull(bean);
65  		bean.getConnection().createStatement();
66  		verify(dataSource).getConnection();
67  	}
68  
69  	@Test
70  	public void shouldAcceptUsernameAndPassword() throws Exception {
71  		DataSource dataSource = mock(DataSource.class);
72  		this.factoryBean.setDataSource(dataSource);
73  		this.factoryBean.setUsername("username");
74  		this.factoryBean.setPassword("password");
75  		DatabaseDataSourceConnection bean = this.factoryBean.getObject();
76  		assertNotNull(bean);
77  		bean.getConnection();
78  		verify(dataSource).getConnection("username", "password");
79  	}
80  
81  	@Test
82  	public void shouldSupportSchema() throws Exception {
83  		DataSource dataSource = mock(DataSource.class);
84  		this.factoryBean.setDataSource(dataSource);
85  		this.factoryBean.setSchema("schema");
86  		DatabaseDataSourceConnection bean = this.factoryBean.getObject();
87  		assertEquals("schema", bean.getSchema());
88  	}
89  
90  	@Test
91  	public void shouldSupportDatabaseConfigBean() throws Exception {
92  		DataSource dataSource = mock(DataSource.class);
93  		this.factoryBean.setDataSource(dataSource);
94  		DatabaseConfigBean databaseConfig = mock(DatabaseConfigBean.class);
95  		this.factoryBean.setDatabaseConfig(databaseConfig);
96  		DatabaseDataSourceConnection bean = this.factoryBean.getObject();
97  		assertNotNull(bean);
98  		verify(databaseConfig).apply(bean.getConfig());
99  	}
100 
101 	@Test
102 	public void shouldBeSingleton() throws Exception {
103 		assertTrue(this.factoryBean.isSingleton());
104 	}
105 
106 	@Test
107 	public void shouldBeCorrectClass() throws Exception {
108 		assertEquals(DatabaseDataSourceConnection.class, this.factoryBean.getObjectType());
109 	}
110 
111 	@Test
112 	public void shouldCreateCreateTransactionAwareConnection() throws Exception {
113 		DataSource dataSource = mock(DataSource.class);
114 		this.factoryBean.setDataSource(dataSource);
115 		DatabaseDataSourceConnection dataSourceConnection = this.factoryBean.getObject();
116 		Connection connection = dataSourceConnection.getConnection();
117 		assertTrue(connection.toString() + " is not transaction aware",
118 				connection.toString().startsWith("Transaction-aware proxy"));
119 	}
120 
121 	@Test
122 	public void shouldNotWrapCreateTransactionAwareConnection() throws Exception {
123 		DataSource dataSource = new TransactionAwareDataSourceProxy(mock(DataSource.class));
124 		this.factoryBean.setDataSource(dataSource);
125 		DatabaseDataSourceConnection dataSourceConnection = this.factoryBean.getObject();
126 		Connection connection = dataSourceConnection.getConnection();
127 		assertTrue(connection.toString() + " is not transaction aware", connection.toString()
128 				.startsWith("Transaction-aware proxy for target Connection  from DataSource [Mock for DataSource"));
129 	}
130 
131 	@Test
132 	public void shouldRespectTransactionAwareAttribute() throws Exception {
133 		DataSource dataSource = mock(DataSource.class);
134 		Connection connection = mock(Connection.class);
135 		given(dataSource.getConnection()).willReturn(connection);
136 		this.factoryBean.setDataSource(dataSource);
137 		this.factoryBean.setTransactionAware(false);
138 		DatabaseDataSourceConnection dataSourceConnection = this.factoryBean.getObject();
139 		Connection actual = dataSourceConnection.getConnection();
140 		assertSame(connection, actual);
141 	}
142 
143 	@Test
144 	public void shouldSupportNewConnection() throws Exception {
145 		DataSource dataSource = mock(DataSource.class);
146 		Connection connection = mock(Connection.class);
147 		given(dataSource.getConnection()).willReturn(connection);
148 		IDatabaseConnection databaseConnection = DatabaseDataSourceConnectionFactoryBean.newConnection(dataSource);
149 		assertNotNull(databaseConnection);
150 		databaseConnection.getConnection().createStatement();
151 		verify(dataSource).getConnection();
152 	}
153 
154 }