2014-01-12 31 views
0

我想在我的蛇游戏的junit中制作测试用例。 我有一个GAMEOVER方法,我想测试一下:具有图形参数的方法的Junit测试用例

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); 
    } 

我的主类是董事会和它扩展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) 
+0

请发布包含java.lang.NullPointerException的错误堆栈跟踪。 – Scott

回答

1

没有深入细节,您可以提供Graphics对象的mock对象。例如,使用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); 
} 
+0

它的工作原理。非常感谢你!! –

0

你被一个组件上调用getGraphics(),几乎总是一个坏主意得到一个Graphics实例,因为对象所获得的图形是永远不会持久,并之前做组件已呈现,一个可怕的想法。所以不要惊讶,它是空的。

解决方案:您应该只处理传递给paintComponnt(Graphics g)方法重写的图形对象,或者如果从BufferedImage获得,就是这样。

+0

对不起,我不明白为了运行gameOver方法,我必须首先有一个g值。请解释。我从来没有使用过paintComponent。如果我只是重写paint,那么如何? –

+1

如果你想这样做,而不是让一个模拟的图形对象作为接受的答案建议,我会做它使用BufferedImage,其createGraphics()方法总是返回一个有效的图形对象。 – Jules