본문 바로가기
에러 해결

TransferService 테스트시 NotEnoughException이 터지지 않는 문제

by sangyunpark99 2024. 7. 17.

📌 Payment를 구현하는 프로젝트에서 생긴 문제

Test코드는 다음과 같다.

@Test
@DisplayName("A계좌에 돈이 충분하지 않아 A계좌에서 B계좌로 이체를 실패한다")
void A계좌에_돈이_충분하지_않아_A계좌에서_B계좌로_이체를_실패한다() throws Exception {
    //given
    final String withdrawalAccountNumber = "0123456789";
    final String depositAccountNumber = "123456789";
    final BigDecimal transferAmount = BigDecimal.valueOf(10000);
    final String accountNumber = "1234";

    final TransferRequest request = new TransferRequest(withdrawalAccountNumber, depositAccountNumber,
            transferAmount, accountNumber);

    final Account withdrawalAccount = Account.builder()
            .accountNumber(withdrawalAccountNumber)
            .balance(BigDecimal.ZERO)
            .password("1234")
            .build();

    final Account depositAccount = Account.builder()
            .accountNumber(depositAccountNumber)
            .balance(BigDecimal.valueOf(10000))
            .password("1235")
            .build();

    //when
    when(accountRepository.getByAccountNumber(withdrawalAccountNumber)).thenReturn(withdrawalAccount);
    when(accountRepository.getByAccountNumber(depositAccountNumber)).thenReturn(depositAccount);

    //then
    Assertions.assertThatThrownBy(() -> transferService.transfer(request)).isInstanceOf(NotEnoughWithdrawalMoney.class);
}

 

분명 withdrawalAccount에 돈이 부족해서, 이체 가능한 돈이 있는지 확인하는 메소드에서 NotEnoughException.class인 언체크 Exception을 throw해야 하는데, 아무런 예외가 던져지지 않았다.

 

// 3. 출금 게좌에 출금 액수만큼 빼준다.
        if(!checkWithdrawalMoney(withdrawalAccount, transferAmount)) {
            throw new NotEnoughWithdrawalMoney();
        }

 

디버깅을 해보니 분명히 이체가 가능한지에 대한 액수를 확인해주는 로직은 정상 실행되고 있었다.

돈을 출금해주는 계좌의 Class를 확인해보니, balance에 100,000원이 찍혀 있었다.

 

분명히 withdrawalAccount를 인스턴스화 할때, 아래와 같이 BigDecimal.ZERO로 선언해주었다.

 

 

이렇게 해주었는데도 값이 100,000으로 변경된 것이라면, 엔티티 클래스의 생성자에서 직접 값을 변경해주어야만 가능하다는 생각을 하였고, 엔티티 클래스를 확인해 보았다.

@Builder
public Account(final Member member, final String accountNumber, final BigDecimal balance, final String password) {
    this.member = member;
    this.accountNumber = accountNumber;
    this.balance = BigDecimal.valueOf(100000);
    this.password = password;
}

 

코드를 확인해보면, balance가 인수로 초기화 되는것이 아니라, 100,000원으로 초기화해주는 것을 확인할 수 있다.

Postman으로 계좌 이체 API를 테스트 해보려고, 잔액을 임의로 추가해주었던 나의 선택이 테스트 코드 오류라는 결과를 불러왔다.

 

👋🏻 오늘의 교훈

 

임의로 수정한 코드는 꼭 다시 원상 복구 시키자

 

 

🙌🏻 문제 해결

 

변경 전

this.balance = BigDecimal.valueOf(100000);

 

변경 후

 

this.balance = balance;​