为什么我的JFrame没有出现在单元测试中?

时间:2018-02-20 17:05:24

标签: java unit-testing jframe junit4 jfreechart

我试图制作一个JFreeChart来比较测试方法的问题大小和运行时间。

以下是制作散点图的类:

public class TestScatterPlot extends JFrame {
    public TestScatterPlot(String title, XYSeriesCollection dataset){
        super(title);
        JFreeChart chart = ChartFactory.createScatterPlot(
                "Time to problem size",
                "problem size",
                "time",
                dataset);
        XYPlot plot = (XYPlot)chart.getPlot();
        plot.setBackgroundPaint(new Color(255,228,196));


        // Create Panel
        ChartPanel panel = new ChartPanel(chart);
        setContentPane(panel);
    }
}

以下是测试方法:

   @Test
   public void testHierholzersAlgorithm() {
        Map<Integer,Long> timeToProblemSize = new HashMap<>();
        for(int trial = 0;trial<1000;trial++) {
            //generate the test data
            long startTime = System.nanoTime();
            //run the method
            long runTime = System.nanoTime() - startTime;
            int dataSize = dataSize();
            //test the data
            timeToProblemSize.put(dataSize,runTime);


        }
        XYSeriesCollection dataset = new XYSeriesCollection();
        XYSeries series = new XYSeries("TimeToProblemSize");
        for(Integer probSize:timeToProblemSize.keySet()){
            series.add(probSize,timeToProblemSize.get(probSize));
        }
        dataset.addSeries(series);
        SwingUtilities.invokeLater(() -> {
            TestScatterPlot example = new TestScatterPlot("",dataset);
            example.setSize(800, 400);
            example.setLocationRelativeTo(null);
            example.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            example.setVisible(true);
        });
    }

当我运行它时,图表框架似乎开始出现然后立即关闭。

如何让我的图表显示?

注意:

这不是this question的重复,因为提问者正在使用扫描仪阅读用户输入。该测试方法中没有扫描仪;所有输入都是随机生成的。

这也不是this question的重复。那个提问者发生了一个Thread.sleep。这里没有Thread.sleep。

1 个答案:

答案 0 :(得分:2)

我假设你正在运行它作为单元测试,测试环境一旦到达测试方法的末尾就会停止测试。 此时invokeLater可能还没有运行。

您可以通过简单的测试来测试,例如:

void test()
    {
        SwingUtilities.invokeLater(() -> {
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                System.out.println("interrupt");
            }
            System.out.println("went through");
        });
    }

这将完全没有任何作用,因为线程在打印完毕之前就会关闭。