### Question:
MySQLUndoDeleteExecutor extends AbstractUndoExecutor { @Override protected String buildUndoSQL() { TableRecords beforeImage = sqlUndoLog.getBeforeImage(); List<Row> beforeImageRows = beforeImage.getRows(); if (CollectionUtils.isEmpty(beforeImageRows)) { throw new ShouldNeverHappenException("Invalid UNDO LOG"); } Row row = beforeImageRows.get(0); List<Field> fields = new ArrayList<>(row.nonPrimaryKeys()); fields.addAll(getOrderedPkList(beforeImage,row,JdbcConstants.MYSQL)); String insertColumns = fields.stream() .map(field -> ColumnUtils.addEscape(field.getName(), JdbcConstants.MYSQL)) .collect(Collectors.joining(", ")); String insertValues = fields.stream().map(field -> "?") .collect(Collectors.joining(", ")); return String.format(INSERT_SQL_TEMPLATE, sqlUndoLog.getTableName(), insertColumns, insertValues); } MySQLUndoDeleteExecutor(SQLUndoLog sqlUndoLog);   }### Answer:
@Test public void buildUndoSQL() { String sql = executor.buildUndoSQL().toLowerCase(); Assertions.assertNotNull(sql); Assertions.assertTrue(sql.contains("insert")); Assertions.assertTrue(sql.contains("id")); }