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

标签 java spring unit-testing mockito

我想使用 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/

相关文章:

java - 异或运算符找到出现一次解释的数字

java - SpringObjectFactory在struts2.3.7中创建应用程序时出错

java - 无法为 Junit 的方法创建模拟调用

unit-testing - 如何在 React JS 中使用 Jest 使用高阶函数编写单元测试

java - 从元素集中删除对象

java - 我如何引用尚未在 xml 文件中创建的 View ?

java - 使用当前系统日期在单独的目录中为每个日期创建日志文件

java - 如何在 Junit 中使用 @InjectMocks 和 @Autowired 注释

java - JPA ManyToMany -关系 - joinTable 未填充

unit-testing - 对 Java 方法进行单元测试