### Question:
UpdateExecutor extends AbstractDMLBaseExecutor<T, S> { @Override protected TableRecords afterImage(TableRecords beforeImage) throws SQLException { TableMeta tmeta = getTableMeta(); if (beforeImage == null || beforeImage.size() == 0) { return TableRecords.empty(getTableMeta()); } String selectSQL = buildAfterImageSQL(tmeta, beforeImage); ResultSet rs = null; try (PreparedStatement pst = statementProxy.getConnection().prepareStatement(selectSQL)) { SqlGenerateUtils.setParamForPk(beforeImage.pkRows(), getTableMeta().getPrimaryKeyOnlyName(), pst); rs = pst.executeQuery(); return TableRecords.buildRecords(tmeta, rs); } finally { IOUtil.close(rs); } } UpdateExecutor(StatementProxy<S> statementProxy, StatementCallback<T, S> statementCallback,
                          SQLRecognizer sqlRecognizer);   }### Answer:
@Test public void testAfterImage() throws SQLException { TableRecords beforeImage = updateExecutor.beforeImage(); TableRecords afterImage = updateExecutor.afterImage(beforeImage); Assertions.assertNotNull(afterImage); afterImage = updateExecutor.afterImage(new TableRecords()); Assertions.assertNotNull(afterImage); afterImage = updateExecutor.afterImage(null); Assertions.assertNotNull(afterImage); }