Spring und Unit-Tests mit Mockito
Ich hatte mich schon längere Zeit gefragt, ob ich nicht noch einfacher auf die Mocks zugreifen kann, um das Verhalten zu manipulieren.
Also recherierte ich ein bißchen und bin dann bei der neusten Mockito-Version (1.9.5) auf die Annotations @Mock und @InjectMocks aufmerksam gewurden.
package de.claudioaltamura.spring.mockito.example.controller; ... import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.Errors; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "masterdatadetailvalidator-test.xml" }) public class MasterDataDetailValidatorTest { @Autowired @InjectMocks private MasterDataDetailValidator validator; private MasterDataFormBean formBean; private Errors errors; @Mock @Autowired private DateRangeValidator dateRangeValidator; @Before public void setUp() { ... } @Test public void test() { final DateRange dateRange = new DateRange(null, null); formBean.getLoginData().setUseraccountValidRange(dateRange); validator.validate(formBean, errors); assertFalse(errors.hasErrors()); } }
Mit @Mock kennzeichne ich einfach die Klassen die zu Mocken sind.
Und @InjectMocks benutze ich für die Klasse, die zu testen ist,
und wo die Mocks injiziert werden sollen. Das ist alles.