3

Is there any way to inject non-mocked objects with @InjectMocks?

My Setup has a UserSignupService with dependencies to a MailService and a UserRepository (a Spring Data Repository). I've a unit test creating a spy of the MailService and I annotated the UserSignupService with @InjectMocks. Sadly this won't inject the UserRepository (non-mocked) into the service class. Combining @InjectMocks with @Autowired won't inject the mocked MailService, but the bean from the application context.

MockitoAnnotations.initMocks() is run in AbstractServiceTest.setUp(). This class also holds the configuration of the the unit test (SpringJunit4TestRunner, etc.)

public class UserSignupServiceTest extends AbstractServiceTest {

  @Autowired @Spy
  private MailService<UserActivationMail> mailService;

  @InjectMocks
  private UserSignupServiceImpl service;

  @Before
  public void setUp() throws Exception {
    super.setUp();
  }
}

@Service
public class UserSignupServiceImpl implements UserSignupService {

  private final UserRepository repository;
  private final MailService<UserActivationMail> mailService;

  @Autowired
  public UserSignupServiceImpl(UserRepository repository,
                               MailService<UserActivationMail> mailService) {
    this.repository = repository;
    this.mailService = mailService;
  }
  //methods...
}
Ihor Patsian
  • 1,288
  • 2
  • 15
  • 25
wbiller
  • 421
  • 3
  • 9

1 Answers1

0

You need to initialize your Mockito MockitoAnnotations.initMocks(this);

Here is sample Spring JUnit test class I have

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:config/spring-context.xml" })
public class SpringKPTest {

    @Autowired
    SomeClassA SomeClassA;

    @Mock
    SomeClassB SomeClassB;



    @Before
    public void init(){
        MockitoAnnotations.initMocks(this);
    }
}
Karthik Prasad
  • 9,662
  • 10
  • 64
  • 112
  • 2
    Actually if you have '@RunWith(SpringJUnit4ClassRunner.class)' annotation you don't have to add MockitoAnnotations.initMocks(this); initialzation to your code, please check http://stackoverflow.com/questions/10806345/runwithmockitojunitrunner-class-vs-mockitoannotations-initmocksthis – erhun Dec 03 '13 at 11:23
  • As mentioned, I already did that. The basic setup is fine and works how it should. The MailService is being spied by Mockito. It's about how to get non-mocked object from the application context to be injected with @InjectMocks. – wbiller Dec 03 '13 at 11:55