package org.springframework.issues;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.replay;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.greaterThan;
import static org.junit.Assert.assertThat;
import org.junit.Test;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.dao.support.PersistenceExceptionTranslator;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.CallCountingTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* Unsucessfully attempts to reproduce the issue described by SPR-8651, in which
* @Scheduled methods within @Repository-annotated components cause an exception.
*
* @author Chris Beams
*/
public class ReproTests {
@Test
public void repro() throws InterruptedException {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(ReproConfig.class);
ctx.refresh();
Thread.sleep(10); // allow @Scheduled method to be called several times
MyRepository repository = ctx.getBean(MyRepository.class);
assertThat("repository is not a proxy", AopUtils.isAopProxy(repository), is(true));
assertThat("@Scheduled method never called", repository.getInvocationCount(), greaterThan(0));
}
@Configuration
@EnableScheduling
@EnableTransactionManagement(proxyTargetClass=true)
static class ReproConfig {
@Bean
public MyRepository repository() {
return new MyRepositoryImpl();
}
@Bean
public PersistenceExceptionTranslationPostProcessor peTranslationPostProcessor() {
return new PersistenceExceptionTranslationPostProcessor();
}
@Bean
public PlatformTransactionManager txManager() {
return new CallCountingTransactionManager();
}
@Bean
public PersistenceExceptionTranslator peTranslator() {
PersistenceExceptionTranslator txlator = createMock(PersistenceExceptionTranslator.class);
replay(txlator);
return txlator;
}
}
}