带有Graphics参数的方法的Junit测试用例

时间:2014-01-12 00:48:14

标签: java junit graphics2d

我试图在junit为我的蛇游戏制作测试用例。 我有一个gameover方法,我正在尝试测试它:

    public void gameOver(Graphics g) {
    String msg = "Game Over";
    final Font small = new Font("Helvetica", Font.BOLD, 14);
    FontMetrics metr = this.getFontMetrics(small);

    g.setColor(Color.white);
    g.setFont(small);
    g.drawString(msg, (WIDTH - metr.stringWidth(msg)) / 2,
                 HEIGHT / 2);
    }

我的主要课程是Board,它扩展了JPanel。测试:

    public void testGameOver() {
    System.out.println("gameOver");
    Board instance = new Board();
    Graphics g = instance.getGraphics();
    instance.gameOver(g);
    Color tmp = new Color(instance.getBackground().getRGB());
    assertEquals(tmp,Color.white.getRGB());
    assertEquals(instance.getFont().getFontName(),new Font("Helvetica", Font.BOLD, 14).getFontName());
    }

当我尝试在实例上运行gameOver方法时,我得到了一个java.lang.NullPointerException。请帮忙!!我是Junit的新人。

Testcase: testGameOver(snake.BoardTest):    Caused an ERROR
null
java.lang.NullPointerException
at snake.Board.gameOver(Board.java:121)
at snake.BoardTest.testGameOver(BoardTest.java:67)

2 个答案:

答案 0 :(得分:1)

在不详细说明的情况下,您可以提供mock Graphics个对象。

例如,使用Mockito

@Test 
public void shouldUpdateGraphicsToGameOver(){
    Graphics gMock = Mockito.mock(Graphics.class);
    //expectations
    Color expectedColor = Color.white;
    Font expectedFont= ...;
    String expectedMsg = ...;
    int expectedWidth = ...;
    int expectedHeight = ...;

    classUnderTest.gameOver(gMock);

    Mockito.verify(gMock).setColor(expectedColor);
    Mockito.verify(gMock).setFont(expectedFont);
    Mocktio.verify(gMock).drawString(expectedMsg, expectedWidth, expectedHeight);
}

答案 1 :(得分:0)

你通过在一个组件上调用getGraphics()获得一个Graphics实例,几乎总是一个坏主意,因为这样获得的Graphics对象永远不会持久,并且之前 组件已经渲染,这是一个可怕的想法。所以不要惊讶它是无效的。

解决方案:您应该只使用传递给paintComponnt(Graphics g)方法覆盖的Graphic对象,或者如果从BufferedImage获取,那就是它。