2014-11-25 4 views
-1

Я не понимаю, почему этот тестовый пример выполняется только в том случае, если я прокомментирую последнюю строку в методе, который находится под тестированием. Я объявила новый объект GameThread, поскольку я думал, что это решит проблему, но это не так. Должен ли я использовать настройку и срыв при тестировании метода, который использует другой экземпляр объекта в тестируемом методе?Испытание Junit при тестировании метода, использующего отдельный класс

public void chainReactionCalculation(Ball previous, Ball current) { 
    // To measure a chain reaction we find out the previous chain number 
    // of the ball that we collided into. We increment our own number as 
    // we are the next layer in the chain and we use the previous balls 
    // chain number to calculate the result and give ourselves a hit score. 
    // The temporary score is updated in the game thread which can then 
    // be used for display and to add to the total static store if level was passed. 
    current.setChainNumber(previous.getChainNumber() + 1); 
    int result = 0; 
    if (previous.getChainNumber() == 0) { 
     result = 100; 
     current.setExplodingBallHitScore(100); 

    } else 
     result = 300 * (int) (Math.pow(previous.getChainNumber(), 3)); 

    current.setExplodingBallHitScore(result); 

    // this line gets commented out to run the test case 
    gameThread.setTempScore(gameThread.getTempScore() + result); 

} 

@Test 
public void scoringTest(){ 

    // These tests test the updating of the chain reaction number 
    // and the hit score that ball should have 
    // NOTE VERY IMPORTANT, Line 179 must be commented out in the ball class 
    // in order for this to work. 


    // A chain reaction of three balls colliding here 
    ball.chainReactionCalculation(ball, collideBall); 
    ball.chainReactionCalculation(collideBall, nonCollideBall); 

    assertEquals(ball.getChainNumber(), 0); 
    assertEquals(0, ball.getExplodingBallHitScore());  

    assertEquals(collideBall.getChainNumber(), 1); 
    assertEquals(100, collideBall.getExplodingBallHitScore()); 

    assertEquals(nonCollideBall.getChainNumber(), 2); 
    assertEquals(300, nonCollideBall.getExplodingBallHitScore()); 

} 

@ джон B В конструкторе gameThread У меня есть объект шар, который создается с gameThread как прошел аргумент. Это ref, который затем используется внутри тестируемого метода. Исключение нулевого указателя выбрасывается на эту строку, если он не закомментирован

+2

Не могу сказать, поскольку мы не видим определения 'gameThread' или того, как оно предоставляется тестируемому классу. Большой вопрос здесь в том, как он не работает, когда строка не закомментирована? –

+0

@ john B В конструкторе gameThread у меня есть объект шара, который создается с помощью gameThread в качестве переданного аргумента. Это ref, который затем используется внутри тестируемого метода. Исключение нулевого указателя выбрасывается на эту строку, если оно не закомментировано. – Nanotron

+1

Это объяснение подразумевает, что что-то (возможно, 'gameThread', так как мы не видим, где это инициализируется) неправильно инициализируется, когда вы работаете под тестом. –

ответ

0

Хорошо, ребята приветствуют ввод, так как я решил его с вашей помощью. То, что я сделал, это создать объект шара с экземпляром gameThread в его конструкторе. Затем я использовал этот ref при вызове метода тестирования, и он сработал. Извините, что я не могу полностью объяснить, как это работает, но в будущем, если кто-то столкнется с той же проблемой, это решает.

Подводя итог, у меня есть объект типа gameThread, который используется для создания объекта шара. Метод в классе шара использует этот gameThread ref для доступа к материалам в экземпляре gameThread. Поэтому при тестировании метода воссоздайте мяч с помощью gameThread и используйте этот ref для вызова тестируемого метода.

Смежные вопросы