2015-11-05 115 views
1

我想测试从Player类调用setter方法的方法randomPlayerStart。我创建了一个测试用例,用于检查玩家的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测试文件中的方法并试图用间谍从框架的Mockito,但没有奏效。当我使用doNothing而不是doAnswer时,我没有收到nullException错误,但是这个方法没有被调用。

@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。我决定创建另一个类(MainActivity主持人),它有三个值,一个界面和两个玩家对象。

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

这意味着我可以通过实例化MainActivityPresenter类,而不是在MainActivity类的调用从测试类中的方法randomPlayerStart(),并没有得到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)

,不是吗? :)