Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jUnit测试的UPDATE语句中使用jOOQs MockResult类_Java_Sql_Jooq - Fatal编程技术网

Java 在jUnit测试的UPDATE语句中使用jOOQs MockResult类

Java 在jUnit测试的UPDATE语句中使用jOOQs MockResult类,java,sql,jooq,Java,Sql,Jooq,我正在为我的DAO层设置一些单元测试用例,以确保它以我需要的方式响应,为此,我需要对我的jOOQ代码进行单元测试。我现在运行的是Jooq3.6.1,并尝试使用JDBC模拟,如下面的链接所述 我的单元测试环境利用JUnit4.12和mockito 不幸的是,虽然这对SELECT查询非常有效,但我很难找出我在更新查询中做错了什么。在非jUnit单元测试中,我知道函数本身正在工作(它也是非常基本的,所以这并不令人震惊),但我也希望能够对这段代码进行一些自动化的单元测试 我的单元测试按以下方式设置: p

我正在为我的DAO层设置一些单元测试用例,以确保它以我需要的方式响应,为此,我需要对我的jOOQ代码进行单元测试。我现在运行的是Jooq3.6.1,并尝试使用JDBC模拟,如下面的链接所述

我的单元测试环境利用JUnit4.12和mockito

不幸的是,虽然这对SELECT查询非常有效,但我很难找出我在更新查询中做错了什么。在非jUnit单元测试中,我知道函数本身正在工作(它也是非常基本的,所以这并不令人震惊),但我也希望能够对这段代码进行一些自动化的单元测试

我的单元测试按以下方式设置:

public class UserDAOTest {
    private static UserDAO userDAO;
    private static Logger LOG = Logger.getLogger(UserDAOTest.class.getName());

    private class MyMockDataProvider implements MockDataProvider {

    @Override
    public MockResult[] execute ( MockExecuteContext ctx ) throws SQLException {
        DSLContext create = DSL.using(SQLDialect.MYSQL);
        MockResult[] result = new MockResult[1];

        String sql = ctx.sql();

        if ( sql.toUpperCase().startsWith("UPDATE") ) {
            Result<UserRecord> userRecordResult = create.newResult(USER);
            userRecordResult.add(create.newRecord(USER));
            userRecordResult.get(0).setValue(USER.ID, 1000);
            userRecordResult.get(0).setValue(USER.USERNAME, "BrumbyUpdateTest");
            userRecordResult.get(0).setValue(USER.CREATED_ON, new Timestamp((new Date()).getTime()));
            userRecordResult.get(0).setValue(USER.UPDATED_ON, new Timestamp((new Date()).getTime()));
            userRecordResult.get(0).setValue(USER.USER_TYPE, "Poster");
            userRecordResult.get(0).setValue(USER.PASSWORD, BCrypt.hashpw("12341234", BCrypt.gensalt()));
            result[0] = new MockResult(1, userRecordResult);
        }
        LOG.info("[execute] :: MockResult.rows=" + result[0].rows);
        LOG.info("[execute] :: MockResult.data=" + result[0].data);
        LOG.info("[execute] :: result=" + result.toString());
        return result;
    }

    @Before
    public void setupTest() {
        DataSourceFactory mockDataSource = mock(DataSourceFactory.class);
        ManagedDataSource ds = mock(ManagedDataSource.class);
        when(mockDataSource.build(any(), any())).thenReturn(ds);
        Environment environment = mock(Environment.class);
        try {
            when(ds.getConnection()).thenReturn(connection);
        } catch (SQLException sqle) {
            LOG.warning("[setupTest] :: sqle=" + sqle.getMessage());
        }
        userDAO = new UserDAO(mockDataSource.build(environment.metrics(), "ds"));
    }

    @Test
    public void testUpdatePassword() {
        boolean out = userDAO.updatePassword(1000, "12341234");
        assertThat(out).isEqualTo(true);
    }
}
但是当我执行单元测试时,UserDAO对象将来自jOOQ的响应视为记录计数0

    Jul 23, 2015 9:23:04 AM com.mycompany.dao.UserDAO updatePassword
    WARNING: [updatePassword] :: count=0
我尝试测试的代码如下所示:

public class UserDAO {
    public boolean updatePassword ( Integer id, String newPassword ) {
        try ( Connection conn = ds.getConnection() ) {
            DSLContext updatePassword = DSL.using(conn, SQLDialect.MYSQL);
            int count = updatePassword.update(USER)
                    .set(USER.PASSWORD, BCrypt.hashpw(newPassword, BCrypt.gensalt()))
                    .where(USER.ID.eq(id))
                    .execute();
            LOG.warning("[updatePassword] :: count=" + count);
            if ( count != 1 ) return false;
            return true;
        } catch ( SQLException sqle ) {
            LOG.warning("[updatePassword] :: sqle=" + sqle.getMessage());
            return false;
        }
    }
}
我是否错误地使用了MockResult对象?也许我误解了,但我相信更新会返回受影响的记录计数,这基于我返回的模拟结果,应该是1。但是UserDAO对象返回0,因此我的测试失败了


提前感谢您的帮助,或者我可以解决这个问题的方向。

我不知道我是否做对了,因为我在回答自己的问题,但我认为我做对了。在过去的两天里,我一直在研究这个问题,并逐步研究jOOQ代码,以了解问题所在。事实证明,问题在于我在测试的这一行中在MockResult对象中提供的数据:

result[0] = new MockResult(1, userRecordResult);
因为我在更新后没有获取数据,所以我不应该包含它。基本上,我可以删除构建userRecordResult对象的所有代码行,而只需按如下方式设置MockResult对象:

result[0] = new MockResult(1, null);
我相信这对我来说是有结果的,没有数据。由于现在没有返回数据,函数现在返回false而不是true。然后,在函数中,来自第410-413行的if块被触发,结果计数被设置为该值

        if (!stmt.execute()) {
            result = stmt.getUpdateCount();
            ctx.rows(result);
        }

以前,当我在MockResult对象中有数据时,MockStatement.execute0()函数返回true,因此上面的if块从未执行过,并且
result
int从未从创建时更改为零。但是对于空数据,行
result=stmt.getUpdateCount()被触发,并且我的值被设置。

对于这个好的解释,我们做了很多。我还在苦苦寻找更新,这解决了我的问题!:)
        if (!stmt.execute()) {
            result = stmt.getUpdateCount();
            ctx.rows(result);
        }