JEditorPaneHTMLEditorKitParserMethodTesting测试

wen java案例 1

本文目录导读:

JEditorPaneHTMLEditorKitParserMethodTesting测试

  1. 基础 JEditorPane + HTMLEditorKit 渲染测试
  2. 测试 Parser 方法:手动调用 HTMLEditorKit 的 Parser 并捕获回调
  3. 单元测试框架示例 (JUnit)
  4. 常见问题与调试技巧

这是一个关于 JEditorPane, HTMLEditorKitParser 的测试或实验类名称,根据这个类名,我推断你很可能是在尝试:

  1. 测试 Java Swing 中 JEditorPane 如何解析和渲染 HTML。
  2. 测试 HTMLEditorKit 的解析器( Parser )方法,例如手动调用 ParserCallback 或自定义解析行为。
  3. 遇到了无法正确解析某些 HTML 内容的问题,想要通过单元测试来排查。

下面我为你提供一个完整的测试示例,涵盖:

  • 基础测试:JEditorPane 设置 HTML 内容并验证渲染。
  • 测试 Parser 方法:通过 HTMLEditorKit.getParser() 手动解析 HTML 并捕获回调。
  • 测试自定义回调处理。

基础 JEditorPane + HTMLEditorKit 渲染测试

这是一个简单的测试类,用于验证 JEditorPane 能够正确显示简单的 HTML。

import javax.swing.*;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTMLDocument;
/**
 * 测试 JEditorPane 使用 HTMLEditorKit 解析和渲染简单的 HTML 内容。
 */
public class JEditorPaneHTMLEditorKitParserMethodTesting {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // 1. 创建 JEditorPane
            JEditorPane editorPane = new JEditorPane();
            editorPane.setEditorKit(new HTMLEditorKit());
            // 2. 设置简单的 HTML 内容
            String htmlContent = """
                    <html>
                    <body>
                        <h1>Hello, Swing!</h1>
                        <p>This is a <b>bold</b> and <i>italic</i> text.</p>
                        <a href='https://example.com'>Click here</a>
                    </body>
                    </html>
                    """;
            // 3. 设置内容并启用编辑(可选)
            editorPane.setContentType("text/html");
            editorPane.setText(htmlContent);
            editorPane.setEditable(false); // 只读显示
            // 4. 显示在 JFrame 中
            JFrame frame = new JFrame("JEditorPane HTML Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new JScrollPane(editorPane));
            frame.setSize(400, 300);
            frame.setVisible(true);
        });
    }
}

测试 Parser 方法:手动调用 HTMLEditorKit 的 Parser 并捕获回调

如果你需要深入测试解析器(例如自定义标签处理、获取所有链接等),可以这样:

import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
import javax.swing.text.html.parser.DTD;
import javax.swing.text.html.HTML;
import javax.swing.text.MutableAttributeSet;
import java.io.StringReader;
import java.io.IOException;
/**
 * 测试手动调用 HTMLEditorKit 的 Parser 并捕获回调事件。
 */
public class ParserMethodTesting {
    public static void main(String[] args) {
        String html = """
                <html>
                <body>
                    <h1>Title</h1>
                    <p>Paragraph with <a href="test.html">link</a></p>
                    <img src="image.png" alt="test">
                </body>
                </html>
                """;
        // 使用 HTMLEditorKit 提供的解析器
        HTMLEditorKit.Parser parser = new HTMLEditorKit().getParser();
        if (parser == null) {
            // 在某些 JDK 版本中 parser 可能为 null,需要手动创建
            // 或者使用 ParserDelegator
            parser = new ParserDelegator();
        }
        StringReader reader = new StringReader(html);
        try {
            parser.parse(reader, new HTMLEditorKit.ParserCallback() {
                @Override
                public void handleText(char[] data, int pos) {
                    System.out.println("Text: " + new String(data));
                }
                @Override
                public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                    System.out.println("StartTag: " + t + " Attributes: " + a);
                }
                @Override
                public void handleEndTag(HTML.Tag t, int pos) {
                    System.out.println("EndTag: " + t);
                }
                @Override
                public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                    System.out.println("SimpleTag (self-closing): " + t + " Attributes: " + a);
                }
                @Override
                public void handleError(String errorMsg, int pos) {
                    System.err.println("Parse Error at " + pos + ": " + errorMsg);
                }
            }, true); // true 表示忽略字符集
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出示例:

StartTag: html Attributes: 
StartTag: body Attributes: 
StartTag: h1 Attributes: 
Text: Title
EndTag: h1
StartTag: p Attributes: 
Text: Paragraph with 
StartTag: a Attributes: {href=test.html}
Text: link
EndTag: a
SimpleTag: img Attributes: {src=image.png, alt=test}
Text: 
EndTag: p
EndTag: body
EndTag: html

单元测试框架示例 (JUnit)

如果你希望做自动化测试,可以这样写一个 JUnit 测试类:

import org.junit.jupiter.api.Test;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTML;
import javax.swing.text.MutableAttributeSet;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
/**
 * JUnit 测试:验证 Parser 回调方法的调用是否符合预期。
 */
class JEditorPaneHTMLEditorKitParserMethodTestingTest {
    @Test
    void testParserExtractsAllTags() throws Exception {
        String html = "<html><body><p>Hello <b>World</b></p></body></html>";
        List<String> tagNames = new ArrayList<>();
        HTMLEditorKit.Parser parser = new HTMLEditorKit().getParser();
        if (parser == null) {
            // 部分 JDK 需要显式加载 DTD,这里用 ParserDelegator 替代
            parser = new javax.swing.text.html.parser.ParserDelegator();
        }
        parser.parse(new StringReader(html), new HTMLEditorKit.ParserCallback() {
            @Override
            public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                tagNames.add(t.toString());
            }
            @Override
            public void handleEndTag(HTML.Tag t, int pos) {
                tagNames.add("/" + t.toString());
            }
            @Override
            public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                tagNames.add(t.toString() + " (self-closing)");
            }
        }, true);
        // 验证标签顺序和类型
        assertEquals(6, tagNames.size());
        assertEquals("html", tagNames.get(0));
        assertEquals("body", tagNames.get(1));
        assertEquals("p", tagNames.get(2));
        assertEquals("b", tagNames.get(3));
        assertEquals("/b", tagNames.get(4));
        assertEquals("/p", tagNames.get(5));
    }
}

常见问题与调试技巧

  1. Parser 为 null 的问题

    • 在 JDK 11+ 中, HTMLEditorKit.getParser() 可能返回 null
    • 解决方案:直接使用 new ParserDelegator() 或手动加载 DTD:
      DTD dtd = DTD.getDTD("html32");
      HTMLEditorKit.Parser parser = new ParserDelegator(dtd);
  2. HTML 内容不渲染 / 显示为纯文本

    • 确保调用了 setContentType("text/html")
    • 检查 HTML 是否格式正确(例如必须包含 <html> 标签)。
    • 使用 setText() 而不是直接操作 Document。
  3. 自定义标签处理

    • 可以通过重写 ParserCallback 来处理自定义标签,例如提取所有 <a> 链接。
    • 示例:提取所有 href 属性。
  4. 样式表 (CSS) 支持

    • JEditorPane 的 HTML 解析器对 CSS 支持非常有限,仅支持内联样式和部分属性。
    • 复杂的 CSS 可能无法正确渲染。

通过上面的示例,你可以:

  • 基础测试:验证 JEditorPane 能否显示 HTML。
  • Parser 方法测试:手动调用解析器并观察回调事件。
  • 单元测试:确保解析器按预期工作。

如果你有具体的测试目标(解析 XHTML、处理特殊字符、测试性能),请提供更详细的描述,我可以给出针对性的解决方案。

抱歉,评论功能暂时关闭!