Tengo una clase (PriceSetter) que estoy probando con Mockito, y la clase tiene una dependencia interna (una base de datos). Quiero simular esta dependencia interna y luego inyectarla en la clase, pero la dependencia no está especificada en mi constructor. Por lo tanto, Mockito intenta automáticamente hacer una inyección de constructor y la dependencia nunca se inyecta.
Intenté usar @Mock en mi objeto de base de datos y @InjectMocks en mi clase PriceSetter, pero Mockito llama automáticamente al constructor y no puede inyectar mi simulacro de base de datos ya que la base de datos no se pasa al constructor.
class PriceSetter {
private Table priceTable;
public PriceSetter(Dependency d1, Dependency d2) {
this.d1 = d1;
this.d2 = d2;
}
}
@RunWith(MockitoJUnitRunner.class)
class PriceSetterTest{
@InjectMocks
private PriceSetter setter;
@Mock Table priceTable;
@Mock Dependency d1;
@Mock Dependency d2;
@Test
public void someTestMethod() {
when(priceTable.getItem(any())).thenReturn(Specified item);
setter.priceTable.getItem("item"); -> Doesn't return item specified by mocked behavior
}
}
Espero que me priceTable
inyecten, pero no se inyecta. Solo d1 y d2 se inyectan mediante inyección de constructor.
@InjectMocks
solo hará una inyección de constructor o inyección de propiedad, no ambas.
Mockito intentará inyectar simulacros solo mediante inyección de constructor, inyección de setter o inyección de propiedad en orden ...
Siempre puedes hacer
@Before
public void setUp() {
setter.setPriceTable(priceTable);
}
O como sea, su mesa debería estar conectada. Sin embargo, el diseño más limpio suele ser unificar su método de inyección de dependencia para inyectar todo en el constructor. Dado @InjectMocks
que elegirá el constructor más grande y trabajará en constructores privados o de paquetes privados, una opción sería agregar una sobrecarga de constructor:
class PriceSetter {
private Table priceTable;
public PriceSetter(Dependency d1, Dependency d2) {
this(d1, d2, new DefaultPriceTable());
}
PriceSetter(Dependency d1, Dependency d2, Table priceTable) {
this.d1 = d1;
this.d2 = d2;
this.priceTable = priceTable;
}
}
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras