2

서비스 테스트 단원을 쓰고 있습니다. 문제는 테스트가 끝난 후 봄 부팅으로 트랜잭션이 자동으로 롤백되지 않는다는 것입니다. 테스트 실행 후스프링 부트, 테스트 후에 트랜잭션이 롤백되지 않습니다.

@SpringApplicationConfiguration(classes = { TestApplicationConfiguration.class, TestDataSourceConfiguration.class }) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class BoardServiceTest { 

@Autowired 
    private UserService userService; 

    @Autowired 
    private CardService cardService; 

    @Autowired 
    private BoardCardService boardCardService; 

    @Autowired 
    private BoardService boardService; 

    @Autowired 
    private CommonBoardService commonBoardService; 

    @Autowired 
    private AuthorityService authorityService; 

    @Test(expected = CommonException.class) 
    @Transactional 
    public void testCreateBoardStatusAFK() { 
     final User admin = userService.findUserById(1l); 
     admin.setCurrentBoard(null); 

     Board board = boardService.startBoard(admin); 
     assertEquals(board, admin.getCurrentBoard()); 

     // Board has status IN_PROGRESS, current time < timeToComplete 
     board.setSelectedCardsCount(boardService.getDefaultCardsToSelectCount() - 1); 
     board.setTimeToComplete(DateUtils.addHours(new Date(), boardService.getDefaultMinsToComplete())); 
     board = commonBoardService.save(board); 
     board = boardService.startBoard(admin); 
     assertEquals(admin.getCurrentBoard().getStatus(), Board.IN_PROGRESS); 

     // Board has status IN_PROGRESS, current time > timeToComplete 
     board.setTimeToComplete(DateUtils.addHours(new Date(), -1)); 
     board = commonBoardService.save(board); 
     board = boardService.startBoard(admin); 

     assertEquals(admin.getCurrentBoard().getStatus(), Board.AFK); 
    } 
} 

는, 테스트 DB에서 해당 테이블이 새 레코드로 채워집니다

여기 내 테스트입니다.

제발,이 문제를 어떻게 해결합니까?

업데이트 : 여기

가이 시험 중에 호출, 내 서비스 방법의 구현 :

@Override 
    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public Board update(Board board, Date finishedDate, Integer status) { 
     board.setStatus(status); 
     board.setFinishedDate(finishedDate); 

     return boardRepository.save(board); 
    } 

로를,이 메서드를 호출 할 때, 새로운 트랜잭션이 열립니다 볼 수 있습니다. 업데이트가 완료된 후 내 디버깅 콘솔에서, 나는 다음과 같은 정보를 볼 : 내가 업데이트 한 기존하고 있지만

Hibernate: select nextval ('boards_id_seq') 
Hibernate: insert into boards (created_date, updated_date, cards_to_hold, cards_to_select, finished_date, holded_cards_count, selected_cards_count, started_date, status, time_to_complete, time_to_next_board, user_id, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 

내가 이해하지, 왜 최대 절전 모드, DB에 새로운 개체를 만들 수 있습니다. 어쩌면 이것이 이러한 행동의 이유입니까?

+0

단위 테스트를 작성하는 경우 데이터베이스에 항목을 저장하는 클래스를 조롱하면 더 쉽게 작동하지 않겠습니까? (저장소, entitymanager, ...) – g00glen00b

+0

@ g00glen00b, 봄은 테스트에서 트랜잭션을 관리하므로 다른 구성 요소를 모의하고 싶지 않습니다. –

+0

테스트 롤백에 관해서. ** @ TransactionConfiguration (defaultRollback = true) **로 테스트 클래스에 주석을 달 수 있습니다. 이렇게하면 트랜잭션이 항상 롤백됩니다. 테스트 클래스에 ** @ Transactional ** 주석을 달아 모든 테스트가 롤백되도록하십시오. –

답변

0

트랜잭션 주석에 rollbackFor 매개 변수를 입력해야합니다. @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) 기본 롤백은 Transactional annotation이있는 검사되지 않은 예외 (RuntimeException 또는 Error의 인스턴스)에만 적용됩니다.

관련 문제