- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个类,它连接到 H2 数据库并运行多个 SQL 语句。
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();
}
}
...
}
我想编写一个单元测试,验证在 open
方法中是否执行了某个 SQL 语句(DROP TABLE IF EXISTS PERSON
)。
为了做到这一点,我编写了以下测试:
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"));
}
}
但它不起作用 - DriverManager
返回真实连接,而不是模拟连接。
我该如何修复它(让 DriverManager
在测试中返回连接模拟)?
这是我项目的pom.xml
,可能那里有问题。
<?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>
最佳答案
这个有效(注意导入):
import static org.easymock.EasyMock.expect;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.powermock.api.easymock.PowerMock.mockStatic;
import static org.powermock.api.easymock.PowerMock.replay;
@RunWith(PowerMockRunner.class)
@PrepareForTest({DriverManager.class, H2Persistence.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);
expect(DriverManager.getConnection(H2Persistence.CONN_TYPE_USER_HOME))
.andReturn(connection);
expect(DriverManager.getConnection(null))
.andReturn(null);
replay(DriverManager.class);
final H2Persistence objectUnderTest = new H2Persistence();
objectUnderTest.open();
verify(statement).executeUpdate("DROP TABLE IF EXISTS PERSON");
verify(statement).executeUpdate(H2Persistence.CREATE_TABLE_PERSON);
}
}
关于java - 如何模拟 DriverManager.getConnection(...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19464975/
我在 spring 上下文中初始化了数据源 bean。请问应该用什么方式?为什么我就是不能写 dataSource.getConnection()? 最佳答案 有一个重要区别:dataSource.g
如果我使用 DriverManager.getConnection() 和 DataSource.getConnection() 获取连接对象,当 .close() 是在那些对象上调用的? 在 .cl
在 DataSource 接口(interface)上,我发现了两种获取连接的方法,有和没有用户名和密码参数。 Connection getConnection()Connection getConn
我想对这段代码进行单元测试,以验证调用了哪个 DriverManager.getConnection() 。DriverManager.getConnection(url,user,pass) 或 D
我正在使用jsPlumb statemachine 。我想稍后保存并加载我的图表。我用谷歌搜索,发现我必须使用 json 对象来做到这一点。我尝试了几个例子stackoverflow 。我能够获得每个
如何模拟 DriverManager.getConnection() 方法? 我想测试我的方法 setUpConnectiontoDB() 我用 PowerMock、easyMock 和 Mokito
数据库连接如下所示 public Connection getDBConection(){ Context context = new InitialContext(); DataSo
我在 Java 文件中找到了这个方法,我想知道这里发生了什么?这真的有效吗?我认为这个方法什么都不做,因为 getConnection() 方法创建了一个新连接,然后它被关闭了。我说得对吗? publ
我正在尝试从nodejs中的mysql连接池获取连接。但是池的 getConnection 方法不会返回回调函数。 (因此它不会显示任何错误或返回连接)。但我的 mysql 工作台显示已建立连接。当我
我正在使用 MySQL 5.5 及其默认值。我创建了一个用户/密码并运行了一个脚本来创建一个名为员工的数据库。通过命令提示符我可以访问数据库: mysql -u user -p SELECT * FR
我有以下情况:我有一个与数据库 (MySQL) 连接的 java 代码。当我从 eclipse 运行 java 代码并从数据库中获取数据时,一切正常。但是当我从 html 代码运行 java 代码作为
我的工作电脑有一个奇怪的问题,也许你可以解决问题。我目前正在使用 jee 进行开发,我遇到了有关 MySQL DB 的问题。 假设我有这个: for(int i = 0; i<20; i++) { /
我编写了 DAO 类 public List getAllClassRooms() { List classRoomsList = new ArrayList<>(); String
在使用 BoneCP 连接池时,我遇到了以下困惑,并希望听到一些关于这方面的建议: 是 getConnection BoneCP线程安全的方法?当有许多线程请求并行连接时,使用它的最佳方法是什么? 每
最近,我们在Hive连接中添加了SSL。我们通过添加 ssl=1;sslTrustStore=C:\\keytabs\\keys.truststore;trustStorePassword=foo 到
在 SignalR 中,ITransportHeartbeat.GetConnections() 的实现应该会为我提供正在跟踪的连接列表。在我的一个案例中,我总是得到一个不再存在的网络套接字连接。 以
我正在使用jdbc连接池,如果我编写像这样的代码 DatabaseMetaData dbMeta = getConnection().getMetaData(); 其中 getConnection()
我有以下代码来测试新服务器上访问数据库的链接,一切都适用于现有服务器,并且我能够访问该文件夹。 !if.exists 返回 true,我可以使用 Runtime.getRuntime().exec("
我正在使用 Java 和 mysql 作为数据库,但遇到了一个奇怪的问题:我的一位客户的连接非常不稳定,有时丢包率可能很高。好吧,我知道这不是软件的错误,但我去那里进行了测试,当程序调用“Driver
这个问题已经有答案了: Solving a "communications link failure" with JDBC and MySQL [duplicate] (25 个回答) 已关闭 4 年
我是一名优秀的程序员,十分优秀!