我试图在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)
答案 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获取,那就是它。