¿Hay una manera de echar legalmente a un objeto de burla Mockito?

Ale Baja:

Escribí un par de clases de casos de prueba para mi pequeño robot de la discordia en Java 11, JUnit Jupiter 5.6.0, 3.3.3 Mockito y API Java discordia 4.1.1_122.

Me di cuenta de que mis casos de prueba tenían varias instancias de comportamiento repetido, incluyendo la declaración de la igualdad de burla utilizados para el mismo propósito, y la repetición de given([method call]).willReturn([object]);mi @BeforeEachmétodo de inicio. Deseaba separar el comportamiento repetido en las clases base a organizarme, pero estoy atascado. Todas mis clases de prueba prueba algún tipo de controlador de eventos en el marco de la API de Java discordia, así que hice una clase de nivel superior denominada GenericEventTest:

public abstract class GenericEventTest {
    @Mock
    protected GenericEvent eventMock;

    @Mock
    protected JDA jdaMock;

    protected GenericEventTest() {
        MockitoAnnotations.initMocks(this);

        given(   eventMock.getJDA()   )
                .willReturn(jdaMock);
    }
}

Deseaba implementar un simulacro de alto nivel para que el evento polimórfica ajuste en mis clases de prueba, a continuación, poner el designado given()mando en la clase que pertenece, porque todas mis pruebas repetir esta misma línea. A continuación, se dio cuenta de que todos mis pruebas estaban probando algún tipo de evento relacionado con los mensajes de la discordia. Así que me prolongado GenericEvente hice GuildMessageEventTest:

public abstract class GuildMessageEventTest extends GenericEventTest {
    @Mock
    protected GenericGuildMessageEvent eventMock;

    @Mock
    protected TextChannel eventChannelMock;

    @Mock
    protected MessageAction messageActionMock;

    protected GuildMessageEventTest() {
        super();

        MockitoAnnotations.initMocks(this);

        given(   eventMock.getChannel()   )
                .willReturn(eventChannelMock);

        given(   eventChannelMock.sendMessage(anyString())   )
                .willReturn(messageActionMock);
    }
}

Mi idea es poner en práctica el siguiente nivel de evento en esta clase, GenericGuildMessageEventque tendrá las mismas given()reglas que se aplican a la misma desde GenericEvent, y luego añadir las correspondientes given()normas en esta clase. Sin embargo, creo que he encontrado mi problema.

Cuando Declaro @Mock protected GenericGuildMessageEvent eventMock;que estoy remedo de la GenericEvent eventMockde GenericEventTest. Por lo tanto, estoy declarando el GenericGuildMessageEventejemplo, pero no estoy reteniendo las given()reglas que se adjuntan a la maqueta en GenericEventTest. Hacer algo como @Mock protected GenericGuildMessageEvent eventMock = (GenericGuildMessageEvent) super.eventMock;no va a funcionar, porque los objetos con anotada @Mockno pueden ser fundidas legalmente en este camino.

Mi pregunta es la siguiente: ¿cómo puedo legalmente constituida fundido a mi instancia de GenericEventen un GenericGuildMessageEventtiempo de haber Mockito copiar las given()reglas unidas a la GenericEventinstancia de la superclase?

VinPro:

Declarar un abstract GenericEvent getEventMock();método en su GenericEventTesty tienen GuildMessageEventTestimplementarlo. A continuación, mueva campo de instancia protected GenericEvent eventMockde su clase base para la clase sub. Uso getEventMock()para acceder a su maqueta en la clase base. Tenga en cuenta que MockitoAnnotations.initMocks(this);no se requiere de nuevo en su subclase. Esto sobrescribirá el comportamiento se burló de su clase base.

// GenericEventTest
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.BDDMockito.given;

public abstract class GenericEventTest {

    protected GenericEventTest() {
        MockitoAnnotations.initMocks(this);

        given(getEventMock().getJDA()).willReturn("jdaMock");
    }

    abstract GenericEvent getEventMock();
}

// GuildMessageEventTest
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.BDDMockito.given;

public abstract class GuildMessageEventTest extends GenericEventTest {
    @Mock
    protected GenericGuildMessageEvent eventMock;

    @Mock
    protected GenericGuildMessageEvent myMock;

    @Override
    public GenericGuildMessageEvent getEventMock() {
        return eventMock;
    }

    protected GuildMessageEventTest() {
        super();

//        MockitoAnnotations.initMocks(this);

        given(eventMock.getChannel())
                .willReturn("eventChannelMock");

    }
}

//The Test
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

public class ActualMessageTest extends GuildMessageEventTest {

    @org.junit.jupiter.api.Test
    public void testX() {
        assertEquals("eventChannelMock", eventMock.getChannel());
        assertEquals("jdaMock", eventMock.getJDA());
        assertNotNull(myMock);
    }

}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=365580&siteId=1
Recomendado
Clasificación