2015-11-05 5 views
1

Я хочу протестировать метод randomPlayerStart, который вызывает метод setter из класса Player. Я создал тестовый файл, который проверяет значение boolean значения игрока.JUnit, вызывающий метод, который вызывает другой метод, возвращает nullPointerException

@Before 
public void setUp() throws Exception { 
    playerA = new Player("Player A", false); 
    playerB = new Player("Player B", false); 
    activity = new MainActivity(); 
    activity.randomPlayerStart(); 
} 

@Test 
public void testrandomPlayerStart() throws Exception { 
    assertEquals(true,playerB.isTurn()); 
} 

Это метод randomPlayerStart.

public void randomPlayerStart() { 
    Random random = new Random(); 
    boolean player = random.nextBoolean(); 

    if (player) { 
     playerA.setTurn(true); 
    } else { 
     playerB.setTurn(true); 
    } 
} 

Я попытался overriding метод в рамках тестового файла и попытался использовать Spy из рамок Mockito, но это не сработало. Я не получаю ошибку nullException, когда я использовал doNothing вместо doAnswer, но затем метод не вызывается.

@Before 
public void setUp() throws Exception { 
    Turn = false; 
    playerA = new Player("Player A", false) { 
     public void setTurn(boolean turn) { 
      Turn = turn; 
     } 
    }; 
    playerB = new Player("Player B", false) { 
     public void setTurn(boolean turn) { 
      Turn = turn; 
     } 
    }; 
    activity = new MainActivity() { 
     public void randomPlayerStart() { 
      Random random = new Random(); 
      boolean player = random.nextBoolean(); 

      if (player) { 
       playerA.setTurn(true); 
      } else { 
       playerB.setTurn(true); 
      } 
     } 
    }; 
    MainActivity spy = Mockito.spy(activity); 

    doAnswer(new Answer() { 
     @Override 
     public Object answer(InvocationOnMock invocation) throws Throwable { 
      activity.randomPlayerStart(); 
      return null; 
     } 
    }).when(spy).randomPlayerStart(); 
    spy.randomPlayerStart(); 
} 

Я не уверен, что попробовать дальше, у меня нет опыта тестирования, поэтому любые комментарии или указания очень ценятся.

+0

'активность = новый MainActivity()' не может сделать это – njzk2

+0

ваш комментарий решить все мои проблемы –

ответ

0

После комментария njzk2. Я решил создать еще один класс (ведущий ведущий), который принимает три значения, интерфейс и два игрока.

public class MainActivityPresenter { 
MainActivityView view; 
Player playerA, playerB; 


public MainActivityPresenter(MainActivityView view, Player playerA, Player playerB) { 


    this.view = view; 
    this.playerA = playerA; 
    this.playerB = playerB; 

} 

public void randomPlayerStart() { 
    Random random = new Random(); 
    boolean player = random.nextBoolean(); 

    if (player) { 
     playerA.setTurn(true); 
    } else { 
     playerB.setTurn(true); 


    } 
} 

public void initPlayers() { 
    playerA = new Player("Player A", false); 
    playerB = new Player("Player B", false); 
    } 
} 

Затем я создал интерфейс, который я применил к классу MainActivity. Теперь стало возможно создать экземпляр класса MainActivityPresenter.

public void startGame(){ 
    initPlayers(); 
    linkIds(); 
    initBtns(); 
    initCells(); 
    initLinkedList(); 
    randomPlayerStart(); 
    hand = new Hand(0); 

    switchTurn(); 
    presenter = new MainActivityPresenter(MainActivity.this, playerA, playerB); 



} 
public void randomPlayerStart() { 
    presenter.randomPlayerStart(); 
} 

означает, что я могу вызвать метод randomPlayerStart() из тестового класса от экземпляра класса MainActivityPresenter вместо класса MainActivity и не получить ошибку NullException.

Спасибо Всего

1

Как насчет того, чтобы вы переместили Random за пределы randomPlayerStart, вы можете просто mock это и легко проверить свой метод.

//omitted declarations 

Random random; 

@Before 
public void setUp() throws Exception { 
    playerA = new Player("Player A", false); 
    playerB = new Player("Player B", false); 
    activity = new MainActivity(); 

    random = mock(Random.class); //static import of Mockito.mock 
} 

@Test 
public void testRandomPlayerStart_playerA() throws Exception { 
    when(random.nextBoolean()).thenReturn(Boolean.TRUE); //static import of Mockito.when 

    activity.randomPlayerStart(random); 
    assertEquals(true,playerA.isTurn()); 
} 

@Test 
public void testRandomPlayerStart_playerB() throws Exception { 
    when(random.nextBoolean()).thenReturn(Boolean.FALSE); 

    activity.randomPlayerStart(random); 
    assertEquals(true,playerB.isTurn()); 
} 

ваш randomPlayerStart нужно будет принимать случайного параметра public void randomPlayerStart(Random random)

После зависимости перемещается за пределы тестирования гораздо проще, не так ли? :)