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 @BeforeEach
mé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 GenericEvent
e 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, GenericGuildMessageEvent
que 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 eventMock
de GenericEventTest
. Por lo tanto, estoy declarando el GenericGuildMessageEvent
ejemplo, 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 @Mock
no pueden ser fundidas legalmente en este camino.
Mi pregunta es la siguiente: ¿cómo puedo legalmente constituida fundido a mi instancia de GenericEvent
en un GenericGuildMessageEvent
tiempo de haber Mockito copiar las given()
reglas unidas a la GenericEvent
instancia de la superclase?
Declarar un abstract GenericEvent getEventMock();
método en su GenericEventTest
y tienen GuildMessageEventTest
implementarlo. A continuación, mueva campo de instancia protected GenericEvent eventMock
de 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);
}
}