gpt4 book ai didi

java - 如何在java中模拟单个语句

转载 作者:行者123 更新时间:2023-11-29 04:38:49 25 4
gpt4 key购买 nike

我想使用 Spring 和 JDBC 实现一个数据库读取器。

@Component
public class MyReader() {

public void read() {
/* Other code */

ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
String myDbValue = rs.getString("myColumn");
}

/* Other code */
}
}

如果 myColumn 列不存在,我想测试我的类的行为。

一个解决方案是将常量 myColumn 移动到一个私有(private)方法,但是 SO 上的一些人告诉其他用户,那个 mocking private methods smells ,请参阅 Raedwalds 评论,我同意。我也可以模拟数据库文件本身,但是 mocking files isn't a good way too .

关于如何处理这个问题有什么想法吗?

最佳答案

您的测试代码,以及您选择模拟的内容/方式,与您正在测试的方法的功能有着内在且密不可分的联系。现在,这并不意味着它应该与该方法的实现相关联(您希望保持这种完全分离),但该方法的核心目的是您应该正在测试。这就是为什么精心设计、深思熟虑的测试会插入良好的 API 设计。

因此,您需要问自己的问题是read 方法在做什么?

我怀疑从执行查询返回的 StatementResultSet 都是实现细节,您可以出于测试目的模拟它们。

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import static org.mockito.Matchers.*;

import java.sql.*;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MyReaderTest {

@InjectMocks
private MyReader myReader;

@SuppressWarnings("unchecked")
@Before
public void setUp() throws Exception {
Statement s = mock(Statement.class);
ResultSet rs = mock(ResultSet.class);

when(s.executeQuery(anyString())).thenReturn(rs);
when(rs.getString("myColumn")).thenThrow(SQLException.class);
}

@Test
public void testRead_AccessNonExistentColumn() {
// Use mock statement and mock resultset
}

}

关于java - 如何在java中模拟单个语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40099577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com