2014-01-12 2 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이 포함 된 stacktrace 오류를 게시하십시오. – Scott

답변

1

mockGraphics 개체를 제공하지 않아도됩니다.

예를 들어 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()를 호출하여 오래 지속 그래픽 인스턴스를 결코지고, 그리고 전에 구성 요소를 그 하고있어 , 끔찍한 생각. 따라서 그것이 null이라는 사실에 놀라지 마십시오.

해결 방법 : paintComponnt(Graphics g) 오버라이드로 전달 된 그래픽 객체 만 사용해야하며 그렇지 않으면 BufferedImage에서 가져온 것입니다.

+0

죄송하지만 이해가 안됩니다 .. 메소드 gameOver를 실행하려면 먼저 g 값을 가져야합니다. 설명 해주십시오. 나는 paintComponent를 사용한 적이 없다. 내가 페인트를 오버라이드하면 어떨까요? –

+1

모의 그래픽 객체를 만들지 않고이 작업을하고 싶다면 받아 들인 대답에서 알 수 있듯이 createGraphics() 메소드가 항상 유효한 Graphics 객체를 반환하는 BufferedImage를 사용하면됩니다. – Jules

관련 문제