sono rimasto molto sorpreso di scoprire che seguente semplice esempio di codice non funziona per tutte le versioni Mockito> 1.8.5Mockito @InjectMocks non funziona per i campi con lo stesso tipo
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {
@Mock(name = "b2")
private B b2;
@InjectMocks
private A a;
@Test
public void testInjection() throws Exception {
assertNotNull(a.b2); //fails
assertNull(a.b1); //also fails, because unexpectedly b2 mock gets injected here
}
static class A{
private B b1;
private B b2;
}
interface B{}
}
In javadocs (http://docs.mockito.googlecode.com/hg/latest/org/mockito/InjectMocks.html) c'è una citazione:
Nota 1: Se si dispone di campi con lo stesso tipo (o lo stesso cancellazione), è meglio nominare tutti @Mock campi annotati con i campi corrispondenti, altrimenti Mockito potrebbe far confusione e l'iniezione non accadrà.
Vuol dire che se ho diversi campi con stesso tipo non posso prendere in giro solo uno di loro, ma piuttosto dovrebbe definire @Mock
per TUTTI campi con lo stesso tipo? E 'noto il limite e c'è qualche ragione per cui non è stato ancora risolto? Dovrebbe essere semplice corrispondere ai nomi dei campi @Mock
, non è vero?
In realtà, l'iniezione potrebbe essere resa un po 'più intelligente per questi casi legittimi, ma la sicurezza è obbligatoria. Le iniezioni avvengono automaticamente, quindi Mockito dovrebbe comportarsi in modo piuttosto riluttante per evitare di fare cose cattive.Inoltre, se l'iniezione è complicata, il tuo oggetto è troppo complicato o deve seguire un altro modello di creazione (un costruttore di Joshua Bloch per esempio) – Brice
Questo è un problema noto e il tuo codice sopra è un aggiramento quando esistono interfacce di derisione dello stesso tipo nel sistema sotto test. – alltej