为什么不在参考前面使用反斜杠

时间:2015-05-18 07:52:39

标签: junit escaping velocity backslash

我写了一个简单的junit测试。我想测试我是否可以在引用前面编写一个java转义反斜杠。这个测试失败了,我不知道为什么。

错误消息:org.junit.ComparisonFailure:expected:< [\ London]>但是:< [$ branch]>

public class VelocityBackslashTest {
    @Test
    public void testVelocityBackslash() {
        String inString = "\\$branch";

        Velocity.init();
        VelocityContext context = new VelocityContext();
        context.put("branch", "London");

        StringWriter writer = new StringWriter();
        Velocity.evaluate(context, writer, "test_1", inString);

        assertEquals("\\London", writer.toString());
    }

}

如果我进行相同的测试但是从文件中读取模板。结果是积极的。

public class VelocityBackslashFileTest {

    @Test
    public void testVelocityBackslash() {

        Properties p = new Properties();
        p.setProperty("resource.loader", "classpath");
        p.setProperty("classpath.resource.loader.class",
                ClasspathResourceLoader.class.getName());
        Velocity.init(p);
        Template template =
                Velocity.getTemplate("velocity/test_template.vm");

        VelocityContext context = new VelocityContext();
        context.put("branch", "London");

        StringWriter writer = new StringWriter();
        template.merge(context, writer);

        assertEquals("\\London", writer.toString());
    }
}

test_template.vm:

\\ $分支

1 个答案:

答案 0 :(得分:1)

这是因为public function editTicket($ticket) { $q = $this->db->where('ticketId', $ticket['ticketId']); $q = $this->db->update('tickets', $ticket); $results = $this->db->affected_rows(); return $results; } 使用java.lang.String作为转义字符。

写作时

\

Java将字符串文字String inString = "\\$branch"; 解释为转义反斜杠,因此传递给Velocity的实际内容是单\\后跟\

Velocity还使用$branch作为转义字符,因此它将其输入(\)解释为转义\$branch符号的指令。换句话说,不要使用它作为Velocity标记只需打印文字$。一旦发生这种情况,当然不会尝试将$解析为参考,因此它将作为文字输出。

要在已解析的Velocity引用前打印branch,Java String需要将2 \\个字符传递给Velocity,这样就可以这样做:

\