package cucumber.runtime.java.spring.hooks;
import cucumber.api.spring.SpringTransactionHooks;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.support.SimpleTransactionStatus;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.isA;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class SpringTransactionHooksTest {
private SpringTransactionHooks target;
@Mock
private BeanFactory mockedBeanFactory;
@Mock
private PlatformTransactionManager mockedPlatformTransactionManager;
@Before
public void setUp() {
target = new SpringTransactionHooks() {
@Override
public PlatformTransactionManager obtainPlatformTransactionManager() {
return mockedPlatformTransactionManager;
}
};
target.setBeanFactory(mockedBeanFactory);
}
@Test
public void shouldObtainPlatformTransactionManagerByTypeWhenTxnManagerBeanNameNotSet() {
SpringTransactionHooks localTarget = new SpringTransactionHooks();
localTarget.setBeanFactory(mockedBeanFactory);
when(mockedBeanFactory.getBean(PlatformTransactionManager.class)).thenReturn(mockedPlatformTransactionManager);
assertSame(localTarget.obtainPlatformTransactionManager(), mockedPlatformTransactionManager);
verify(mockedBeanFactory).getBean(PlatformTransactionManager.class);
}
@Test
public void shouldObtainPlatformTransactionManagerByNameWhenTxnManagerBeanNameIsSet() {
SpringTransactionHooks localTarget = new SpringTransactionHooks();
localTarget.setBeanFactory(mockedBeanFactory);
final String txnManagerBeanName = "myTxnManagerBeanName";
localTarget.setTxnManagerBeanName(txnManagerBeanName);
when(mockedBeanFactory.getBean(txnManagerBeanName, PlatformTransactionManager.class)).thenReturn(mockedPlatformTransactionManager);
assertSame(localTarget.obtainPlatformTransactionManager(), mockedPlatformTransactionManager);
verify(mockedBeanFactory).getBean(txnManagerBeanName, PlatformTransactionManager.class);
}
@Test
public void shouldObtainOrStartTransactionInBeforeHook() {
final SimpleTransactionStatus dummyTxStatus = new SimpleTransactionStatus();
when(mockedPlatformTransactionManager.getTransaction(isA(TransactionDefinition.class))).thenReturn(dummyTxStatus);
target.startTransaction();
assertSame(target.getTransactionStatus(), dummyTxStatus);
}
@Test
public void shouldTriggerTransactionRollbackInAfterHook() {
final SimpleTransactionStatus dummyTxStatus = new SimpleTransactionStatus();
target.setTransactionStatus(dummyTxStatus);
target.rollBackTransaction();
verify(mockedPlatformTransactionManager).rollback(dummyTxStatus);
}
}