PowerMockitoユニットテスト(1)-主な考え方と通常の異常カバー



1.主な操作手順をテストする:
【テストする方法】:
@Component
public class UserDao{
     
	@Autowired
	private UserMapper userMapper
	@Autowired
	private SystemErrorRecoder systemErrorRecoder
	
	public List<UserDTO> getUsers(String userName){
     
		List<UserDTO> userDtos = null;
		try{
     
			userDtos = userMapper.getUsers(userName);
		}catch(DataAccessException e){
     
			systemErrorRecoder.addMsgError(e.getMessage());
		}
	
		if(CollectionUtils.isEmpty(userDtos)){
     
			return new ArrayList();
		}
		return userDtos;
	}
}

【試験方法】:
@RunWith(PowerMockRunner.class)	//   ,    PowerMock          
@PowerMockIgnore("javax.management.*")//    previously initiated loading for different type with name "javax/managemen
public class UserDaoTest[
	private UserDao userDao;
	private	UserMapper userMappers;
	private	SystemErrorRecoder systemErrorRecoder;
	
	@Before// @Test       ,     
	public void setUp(){
     
		userDao = new UserDao();
		userMappers = PowerMockito.mock(UserMapper.class)//mock  UserMapper      
 		systemErrorRecoder = PowerMockito.mock(SystemErrorRecoder.class);
		Whitebox.setInternalState(userDao,"userMapper",userMappers)//    userDao       userMapper  userMappers
		Whitebox.setInternalState(userDao,"systemErrorRecoder",systemErrorRecoder)}
	
	@Test
	public void testGetUsers(){
     
		List<UserDTO> userDtos = new ArrayList<>();
		userDtos.add(new UserDTO);
		userDtos.add(new UserDTO);
		PowerMockito.when(userMappers.getUsers("test").thenReturn(userDtos);
		Assert.assertEuqals(userDtos,userDao.getUsers("test"))
		//      Catch    (            )
		
		//a.     
		DataAccessException exception = PowerMockito.mock(DataAccessException.class);
		//b.  try    ,doThrow  
		PowerMockito.doThrow(exception).when(userMappers).getUsers("test")
		//c.  catch    (  catch        ,    )
		PowerMockito.doNothing().when(systemErrorRecoder).addMsgError(Mockito.anyString())
		//d.          
		Assert.assertTure(CollectionUtils.isEmpty(userDao.getUsers("test")))

【異常オーバーライド】:
上記のようにdoThrowで上書きし、catch以外のコードをテストしてから異常なコードをテストします.そうしないとtest should never throw an exception to this levelと報告される可能性があります.
【主な考え方】:
   ①. 新試験方法クラスオブジェクトが真のオブジェクトであるuserDaoが真のオブジェクトである場合,その属性userMapperも真の属性である.
   ②. mockで出てくるオブジェクトはエージェントオブジェクト、すなわちuserMappersはエージェントオブジェクト
   ③. エージェントオブジェクトをリアルオブジェクトのプロパティにマップする:Whitebox.setInternalState
   ④. PowerMockitoでエージェントオブジェクトが何をするか、何を返すかを期待します.たとえば、PowerMockito.when(userMappers.getUsers(“test”).thenReturn(userDtos); ユーザマップはgetUsersメソッドを実行し、所望のユーザDtosオブジェクトにどのようにアクセスするかを期待する
   ⑤. 実際のオブジェクトが同じメソッドをトリガすると、実際に実行されるときにエージェントオブジェクトのメソッドがエージェントされます.エージェントオブジェクト実行方法の所望の戻り値、すなわち期待値.実オブジェクトがメソッドを実行する後の戻り値、すなわち実値getUsersメソッドの場合、期待値と真実値が一致しているかどうかを判断することで、テストメソッドが正しいかどうかを知ることができます.