Przemysław Sienkiewicz Przemysław Sienkiewicz - 1 month ago 9
Java Question

Test configuration annotations in separate annotation

I have a problem with spring annotations. All I want to do is grab whole necessary test annotations to one annotation with common config and I get null pointer exception when Spring Context starts (cannot autowire beans) but when I use those annotations separately in every test class everything works fine.

Here is an example:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { JPAConfig.class, AOPConfiguration.class })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class })
public @interface MyTestAnnotations {
}


And test case that I want to use configuration from @MyTestAnnotations

@MyTestAnnotations
public class AspectTest {

@Autowired
PagingAndSortingBookRepository pagingAndSortingRepo;
@Autowired
SmartLoggerAspect smartLoggerAspect;

JoinPoint joinPoint;
// other methods

@Test
public void pagingTest(){
// line below throws nullPointerException
pagingAndSortingRepo.findAll(new PageRequest(1, 1));
}
}

Answer

This is because by the design you can not combine @ContextConfiguration with custom annotation. see the nice explanation provided sam branan why it would not work

you should be able to use something like this

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class })
public @interface MyTestAnnotations {
}

@MyTestAnnotations
public abstract class AbstractBaseTests
{
}


@ContextConfiguration(classes = { JPAConfig.class, AOPConfiguration.class })
public class MyTest extends AbstractBaseTests {
  }