Junit Test Application-51-입출금내역 기능 JUnit 테스트

jaegeunsong97·2023년 8월 10일
0
post-thumbnail

Junit Bank Application 깃허브

Junit Bank Application 기록 노션

  • 서비스 테스트, X

서비스 테스트의 경우

할게 없다. 왜냐하면 Repossitory에서 가져오는 것들은 서비스단에서 테스트하는 것들이 아니여서 stub이 사용이 되고, checkOwner() 같은 경우는 이미 기존에 테스트로 검증이 되었기 때문에 할 필요가 없다.

따라서 컨트롤러 테스트에서 Dto까지 같이 검증을 해줘야한다.

  • 컨트롤러 테스트
package shop.mtcoding.bank.web;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;

import javax.persistence.EntityManager;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.security.test.context.support.TestExecutionEvent;
import org.springframework.security.test.context.support.WithUserDetails;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;

import com.fasterxml.jackson.databind.ObjectMapper;

import shop.mtcoding.bank.config.dummy.DummyObject;
import shop.mtcoding.bank.domain.account.Account;
import shop.mtcoding.bank.domain.account.AccountRepository;
import shop.mtcoding.bank.domain.transaction.Transaction;
import shop.mtcoding.bank.domain.transaction.TransactionRepository;
import shop.mtcoding.bank.domain.user.User;
import shop.mtcoding.bank.domain.user.UserRepository;

@ActiveProfiles("test") // 테스트 모드
@Sql("classpath:db/teardown.sql") // BeforeEach 직전 실행
@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
public class TransactionContollrerTest extends DummyObject {

     @Autowired
     private MockMvc mvc;
     @Autowired
     private ObjectMapper om;
     @Autowired
     private EntityManager em;
     @Autowired
     private TransactionRepository transactionRepository;
     @Autowired
     private AccountRepository accountRepository;
     @Autowired
     private UserRepository userRepository;

     @BeforeEach
     public void setUp() {
          dataSetting();
          em.clear();
     }

     @WithUserDetails(value = "ssar", setupBefore = TestExecutionEvent.TEST_EXECUTION)
     @Test
     public void findTransactionList_test() throws Exception {
          // given
          Long number = 1111L;
          String gubun = "ALL";
          String page = "0";

          // when
          ResultActions resultActions = mvc
                    .perform(get("/api/s/account/" + number + "/transaction").param("gubun", gubun)
                              .param("page", page));
          String responseBody = resultActions.andReturn().getResponse().getContentAsString();
          System.out.println("테스트 : " + responseBody);

          // then
          resultActions.andExpect(jsonPath("$.data.transactions[0].balance").value(900L));
          resultActions.andExpect(jsonPath("$.data.transactions[1].balance").value(800L));
          resultActions.andExpect(jsonPath("$.data.transactions[2].balance").value(700L));
          resultActions.andExpect(jsonPath("$.data.transactions[3].balance").value(800L));
     }

     private void dataSetting() {
          User ssar = userRepository.save(newUser("ssar", "쌀"));
          User cos = userRepository.save(newUser("cos", "코스,"));
          User love = userRepository.save(newUser("love", "러브"));
          User admin = userRepository.save(newUser("admin", "관리자"));

          Account ssarAccount1 = accountRepository.save(newAccount(1111L, ssar));
          Account cosAccount = accountRepository.save(newAccount(2222L, cos));
          Account loveAccount = accountRepository.save(newAccount(3333L, love));
          Account ssarAccount2 = accountRepository.save(newAccount(4444L, ssar));

          Transaction withdrawTransaction1 = transactionRepository
                    .save(newWithdrawTransaction(ssarAccount1, accountRepository));
          Transaction depositTransaction1 = transactionRepository
                    .save(newDepositTransaction(cosAccount, accountRepository));
          Transaction transferTransaction1 = transactionRepository
                    .save(newTransferTransaction(ssarAccount1, cosAccount, accountRepository));
          Transaction transferTransaction2 = transactionRepository
                    .save(newTransferTransaction(ssarAccount1, loveAccount, accountRepository));
          Transaction transferTransaction3 = transactionRepository
                    .save(newTransferTransaction(cosAccount, ssarAccount1, accountRepository));
     }
}

profile
블로그 이전 : https://medium.com/@jaegeunsong97

0개의 댓글