@Transactional(propagation = Propagation.REQUIRED)
public void exe() {
try {
Reserve reserveInfo = newTransactionTemplate.execute(new TransactionCallback<Reserve>() {
@Override
public Reserve doInTransaction(TransactionStatus status) {
return reserveService.callReserve(reserveDetails);
}
});
if(reserveInfo != null && reserveInfo.getStatus()=="DONE") {
someOtherService.doSomething();
}
} finally {
if(reserveInfo!= null && reserveInfo.getStatus().equals("DONE")){
final String id = reserveInfo.getId();
Release releaseInfo = newTransactionTemplate.execute(new TransactionCallback<Release>() {
@Override
public Release doInTransaction(TransactionStatus status) {
return reserveService.callRelease(id);
}
});
if (releaseInfo.getStatus() != "RELEASED") {
throw new RuntimeException("Problem in releaseing");
}
}
}
}
테스트 할 샘플 코드입니다. 나는 그물에 익명의 클래스를 테스트 할 때 많은 것을 발견 할 수 없었다. exe () 메서드를 테스트하고 newTransactionTemplate.execute 메서드를 통해 호출하여 reserveService.callReserve (reserveDetails)에 대한 호출을 모의 처리하려고합니다.mockito를 사용하여 익명 클래스 내에서 메서드 호출을 테스트하는 방법
어떤 상황에서도이 상황을 어떻게 테스트 할 수 있습니까?
private SomeService someService = null;
@Mock
private ReserveService mockReserveService;
@Mock
private ReleaseService mockReleaseService;
@Mock
private TransactionTemplate mockTransactionTemplate;
@Mock
private SomeOtherService mockSomeOtherService;
@BeforeMethod
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
someService = new SomeService();
someService.setReserveService(mockReserveService);
someService.setReleaseService(mockReleaseService);
someService.setSomeOtherService(mockSomeOtherService);
someService.setNewTransactionTemplate(mockTransactionTemplate);
}
@Test(enabled=true)
public void exeHappyPath() {
Reserve reserveInfo = new Reserve();
reserveInfo.setId("123");
reserveInfo.setStatus("DONE");
Release releaseInfo = new Release();
releaseInfo.setStatus("RELEASED");
when(mockReserveService.callReserve(Mockito.any(ReserveDetails.class))).thenReturn(reserveInfo);
when(mockReserveService.callRelease(reserveInfo.getId())).thenReturn(releaseInfo);
when(mockTransactionTemplate.execute(Mockito.<TransactionCallback<Reserve>>any())).thenReturn(reserveInfo);
when(mockTransactionTemplate.execute(Mockito.<TransactionCallback<ReleaseInfo>>any())).thenReturn(releaseInfo);
//Call the exe method
someService.exe();
verify(mockReserveService, times(1)).callReserve(Mockito.any(ReserveDetails.class));
verify(mockReserveService, times(1)).callRelease(reserveInfo.getId()));
verify(mockSomeOtherService, times(1)).doSomthing());
}
java.lang.ClassCastException가 (mockTransactionTemplate.execute이 .. releaseInfo 반환 개체 발생과 때와 두 번째 호출 :
예 .ReserveService는 속성을 통해 주입됩니다. – Anj
예 .ReserveService는 속성을 통해 주입됩니다. 이 테스트는 속성을 통해 주입되는 newTransactionTemplate.execte() 메서드에 대한 호출을 포함합니다. – Anj
'ReserveService reserveService = mock (ReserveService.class); TransactionTemplate newTransactionTemplate = mock (TransactionTemplate.class); SomeClass 인스턴스 = new SomeClass(); instance.setReserveService (reserveService); instance.setNewTransactionTemplate (newTransactionTemplate); 이제 'SomeClass # exe()'를 호출 할 수 있지만 이것이 당신을 위해 무엇을 할 것인지 정확히는 알 수 없습니다. 정확하게 테스트하려고하는 것은 무엇입니까? –