Wie zum Hohn DriverManager.getConnection(...)?
Habe ich eine Klasse, die eine Verbindung zu einer H2-Datenbank und führt mehrere SQL-Anweisungen.
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();
}
}
...
}
Ich möchte schreiben Sie einen unit test, der überprüft, dass in der open
Methode eine bestimmte SQL-Anweisung (DROP TABLE IF EXISTS PERSON
) ausgeführt wird.
Um dies zu tun, schrieb ich folgenden test:
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"));
}
}
Aber es funktioniert nicht - stattdessen wird der mock-Verbindung DriverManager
gibt wirkliche Verbindung.
Wie ich es beheben kann (machen DriverManager
return-Anschluss mock-im-test) ?
Hier ist die pom.xml
von meinem Projekt, vielleicht ist etwas falsch.
<?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>
InformationsquelleAutor DP_ | 2013-10-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser arbeitet (achten Sie auf die Import):
InformationsquelleAutor DP_
Den üblichen Weg, dies zu tun wäre, um den Faktor aus der Verbindung der Schöpfung in eine andere Klasse, und injizieren eine Instanz, die in der betreffenden Klasse. Dann können Sie spotten, dass die neue Klasse.
In deinem Fall, so etwas wie dieses:
In diesem besonderen Fall, noch besser wäre wahrscheinlich die standard-JDBC-Schnittstelle
DataSource
anstatt Ihre eigenen Verbindungs-factory-Klasse:Das ist definitiv eine Gefahr, unter diesem Ansatz beim schreiben von mock-basierten tests. Ich arbeite auf einer Codebasis, wo ein Großteil der Logik wurde Boden zu einem feinen Pulver durch die Mühlsteine von mock-driven refactoring. In diesem Fall, gegeben, dass
DataSource
bereits vorhanden ist, stellt eine wohl definierte, in sich geschlossenes Konzept, und hat-Implementierungen schon, ich würde denken, dass das Risiko von vorformulierten überwucherung ist klein.InformationsquelleAutor Tom Anderson