¿Cómo inyectar campos usando Mockito sin especificarlos en el constructor?

UpsBing:

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 priceTableinyecten, pero no se inyecta. Solo d1 y d2 se inyectan mediante inyección de constructor.

Mark Peters:

@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 @InjectMocksque 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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

¿Cómo inyectar campos usando Mockito sin especificarlos en el constructor?

¿Cómo inyectar correctamente el servicio en el constructor?

¿Cómo inyectar el método lambda en el constructor?

¿Cómo inyectar DbContext en el constructor de clases NRules?

¿Cómo inyectar todas las clases que implementan la misma interfaz genérica en el constructor usando StructureMap?

Inyectar ChangeTracker en el constructor

Cómo inyectar valor de propiedad usando @Value en campos estáticos

Cómo inyectar el servicio en el componente Angular 1.5 (sin mecanografiado)

Mockito: cómo inyectar el campo final marcado como @Mock por el constructor cuando se usa @Spy y @InjectMocks

Cómo inyectar un tipo en lugar de una instancia en un constructor usando Unity

Cómo inyectar un tipo en lugar de una instancia en un constructor usando Unity

¿Cómo puedo inyectar interfaz en el constructor del controlador en Yii2?

¿Cómo inyectar un componente principal en una directiva compartida sin especificar el tipo de componente?

Cómo usar Autofac para inyectar una implementación específica en el constructor

¿Cómo inyectar la implementación de DbContext en el constructor Prism ViewModel?

Java - Mockito - cómo inyectar dependencia en abstracto en prueba

¿Cómo inyectar el documento en servicio?

¿Cómo inyectar campos en métodos bean?

Mensaje 'No hay un constructor sin parámetros definido para el tipo SiteResourceGraphType', al inyectar el repositorio en SiteResourceGraphType

Cómo inyectar HttpServletRequest en ContainerRequestFilter con Mockito @InjectMocks

Cómo inyectar 'Microsoft.Extensions.Configuration.IConfiguration' usando el método AddTransient en XUnit

Cómo inyectar 'Microsoft.Extensions.Configuration.IConfiguration' usando el método AddTransient en XUnit

¿Cómo probar InternalServerError usando mockito en el repositorio?

Cómo inyectar mobx store en un componente sin estado

Cómo calcular dos campos de formulario de entrada y poner el valor en otro sin enviar el formulario usando jquery con JSF

cómo analizar los campos sin procesar de Mysql en el objeto en el nodo js

Permitir parámetros opcionales en Joi sin especificarlos

Subsección de varios objetos en R sin especificarlos todos

Cómo inyectar código usando libclang (en C ++)

TOP Lista

CalienteEtiquetas

Archivo