mockitobeans is a supercharged @InjectMocks that will allow you to have all your mocked beans autowire seamlessly by just using Spring's own @Autowire syntax.
mockitobeans started when I was looking for a way to use mockito to mock complex objects that had autowired dependencies which had additional autowired dependencies and so on...
- @InjectMocks only injects the dependencies of the class that has been annotated. It does not inject the dependencies of that
- @Autowire by default sets it's annotation attribute "required" to "true". This is a huge pain especially when you only want to inject 2 out of the 12 dependencies for your tests
@Configuration
@MockedBeans(mockClasses={PersonDao.class},
spyClasses={PersonService.class},
scope="my-custom-scope")
public class AppConfig {}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=AppConfig.class)
public class MyTestCase {
// Since the @MockedBeans adds PersonService as a spring bean
// we can autowire it here
@Autowired
private PersonService personService;
@Autowired
private PersonDao personDao;
}
Traditionally, if you try to create a bean with the following:
public class PersonService {
@Autowired
private PersonDao personDao;
@Autowired
private AddressDao addressDao;
}
you will be forced to declare both personDao and addressDao. To circumvent this, but still retain the autowiring capabilities, you can add DisableAutowireRequireInitializer which will cause the AutowiredAnnotationBeanPostProcessor to not throw an error when a bean is not found for autowiring
@ContextConfiguration(initializers=DisableAutowireRequireInitializer.class)
Now, when you declare you application context and you're missing one of the dependencies, no errors will occur.
@Configuration
// You don't even have to declare ANY of your dependencies at all!
@MockedBeans(mockClasses={PersonService.class})
public class AppConfig {}
Props to knes1 for this blogpost http://knes1.github.io/blog/2014/2014-08-18-concise-integration-tests-that-contain-mocks-in-spring-framework.html which inspired this project