### Question:
StringSubstitutorTemplateEngine implements TemplateEngine { @Override public String render(String template, StatementContext ctx) { StringSubstitutor substitutor = new StringSubstitutor(ctx.getAttributes()); customizer.accept(substitutor); return substitutor.replace(template); } StringSubstitutorTemplateEngine();  StringSubstitutorTemplateEngine(Consumer<StringSubstitutor> customizer); @Override String render(String template, StatementContext ctx); static StringSubstitutorTemplateEngine between(char prefix, char suffix); static StringSubstitutorTemplateEngine between(String prefix, String suffix); static StringSubstitutorTemplateEngine between(char prefix, char suffix, char escape); static StringSubstitutorTemplateEngine between(String prefix, String suffix, char escape);  }### Answer:
@Test public void testDefaults() { attributes.put("name", "foo"); assertThat(new StringSubstitutorTemplateEngine().render("create table ${name};", ctx)) .isEqualTo("create table foo;"); }