Bir H2 veritabanına bağlanan ve birkaç SQL deyimi çalıştıran bir sınıfım var.DriverManager.getConnection (...) ile nasıl bağlantı kurulur?
public class H2Persistence implements IPersistence {
private Connection conn;
@Override
public void open() {
try
{
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection(CONN_TYPE_USER_HOME);
final Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE PERSON(" +
"ID BIGINT,"+
"AGEGROUP VARCHAR(255),"+
"MONTHLY_INCOME_LEVEL VARCHAR(255)," +
"GENDER VARCHAR(1),"+
"HOUSEHOLD_ID BIGINT)");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
...
}
ben open
yönteminde belli bir SQL deyimi (DROP TABLE IF EXISTS PERSON
) yürütüldüğünde bu, doğrular bir birim testi, yazmak istiyorum.
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest(DriverManager.class)
public class H2PersistenceTest {
@Test
public void testDropPersonIsCalled() throws SQLException {
final Statement statement = mock(Statement.class);
final Connection connection = mock(Connection.class);
when(connection.createStatement()).thenReturn(statement);
mockStatic(DriverManager.class);
when(DriverManager.getConnection(H2Persistence.CONN_TYPE_USER_HOME)).thenReturn
(connection);
final H2Persistence objectUnderTest = new H2Persistence();
objectUnderTest.open();
verify(statement.executeUpdate("DROP TABLE IF EXISTS PERSON"));
}
}
Ama çalışmıyor - yerine sahte bağlantısı, DriverManager
döner gerçek bağlantının:
Bunu nasıl düzeltebilirim (sınamada DriverManager
dönüş bağlantısı sahte olun)?
Projemin pom.xml
işte burada bir sorun var.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.mycompany</groupId>
<artifactId>myproduct</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<powermock.version>1.5.1</powermock.version>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-util</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert-core</artifactId>
<version>2.0M8</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>15.0</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.173</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
ben befor yaptık e (ayrıntılar için bkz. http://altruix.wordpress.com/portfolio/project-control-center/). Sorun şu ki, çok sayıda sınıf yazıyorsanız, bir çok kodlu kodla (arayüz, fabrika arayüzleri ve uygulamaları) sonuçlanırsınız. Bu yüzden, maliyetler olmaksızın bu tasarımın (test edilebilirlik) avantajını elde etmeye çalıştım (boilerplate kodu). –
Sahte tabanlı testler yazarken bu yaklaşımı kullanmak kesinlikle bir tehlikedir. Mantığın büyük bir kısmının sahte güdümlü refactoring'in değirmen taşları tarafından ince bir toz haline getirildiği bir kod tabanı üzerinde çalışıyorum. Bu durumda, 'DataSource'un zaten var olduğu, iyi tanımlanmış, bağımsız bir konsepti temsil ettiği ve halihazırda uygulamalara sahip olduğu göz önüne alındığında, kazanların aşırı büyümesinin riskinin küçük olduğunu düşünürdüm. –