- 참고 URL
- https://code.google.com/p/powermock/wiki/MockitoUsage13
- http://stackoverflow.com/questions/11458963/mockito-0-matchers-expected-1-recorded-invaliduseofmatchersexception
단위테스트는 환경에 영향받지 않고 어떤 환경이든 해당 단위(메소드 또는 기능)에 대해 의도한 대로 로직이 구현되어있음을 확인하는것으로
1. library 준비
- http://mvnrepository.com/artifact/org.powermock
- powermock-module-junit : junit과 연동하기위한 dependency. Runner class가 들어있다.
- powermock-api-mockito : Mock 처리를 위한 dependency. Powermockito class가 들어있다.
@RunWith(PowerMockRunner.class) |
FINAL METHOD Mocking
- 참고 URL
- http://stackoverflow.com/questions/11458963/mockito-0-matchers-expected-1-recorded-invaliduseofmatchersexception
- http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/transaction/support/AbstractPlatformTransactionManager.html#getTransaction(org.springframework.transaction.TransactionDefinition)
- http://docs.spring.io/spring-framework/docs/2.0.x/api/org/springframework/transaction/PlatformTransactionManager.html#getTransaction(org.springframework.transaction.TransactionDefinition)
[Logic] - 메소드 내에 다음과 같은 로직이 들어있었다. 바꾸기는 부담스럽고(history를 알 수 없어서), 일단 테스트를 하려고보니... @Autowired // 사실은 spring version이 낮아 setter method 로 들어갔음. DefaultTransactionDefinition def = new DefaultTransactionDefinition(); |
[TEST] - transactionManager.getTransaction(def) 이 statement를 mocking 하기위해 다음과 같이 했더니 에러가 발생한다. when(mockTransactionManager.getTransaction(any(DefaultTransactionDefinition.class))).thenReturn(mockTransactionStatus); org.mockito.exceptions.misusing.InvalidUseOfMatchersException: |
뭐가 문제인지 몰라 한참을 확인해보니.... 구현체의 메소드가 final로 선언되어 변경이 불가능한것이었다! 그래서..저런에러가..
그래서인지 실제 로직에서는 인터페이스를 통해 구현체를 주입받도록 권고하나 보다.. 이 TransactionManager의 interface인 PlatformTransactionManager는 getTransaction 메서드가 public으로 선언되어있어 일반적인 방법으로도 충분히 mocking이 가능하다. |
'myplace' 카테고리의 다른 글
Maven test와 junit의 동작 차이 (@Ignore annotation이 다르게 동작해요) (0) | 2015.05.14 |
---|---|
SonarQube (0) | 2014.09.06 |
jenkins CI Server (0) | 2014.09.05 |