Java 有没有一种方法可以合法地投射Mockito mock对象?
我用Java 11、JUnit Jupiter 5.6.0、Mockito 3.3.3和Java Discord API 4.1.1122为我的小型Discord机器人编写了几个测试用例类 我意识到我的测试用例有多个重复行为的实例,包括用于相同目的的相等模拟的声明,以及Java 有没有一种方法可以合法地投射Mockito mock对象?,java,unit-testing,mockito,polymorphism,discord-jda,Java,Unit Testing,Mockito,Polymorphism,Discord Jda,我用Java 11、JUnit Jupiter 5.6.0、Mockito 3.3.3和Java Discord API 4.1.1122为我的小型Discord机器人编写了几个测试用例类 我意识到我的测试用例有多个重复行为的实例,包括用于相同目的的相等模拟的声明,以及给定的重复([method call])。willReturn([object])在我的@beforeach启动方法中。我希望将重复的行为分成基类来组织自己,但我被卡住了。 我所有的测试类都在Java Discord API框架中
给定的重复([method call])。willReturn([object])代码>在我的@beforeach
启动方法中。我希望将重复的行为分成基类来组织自己,但我被卡住了。
我所有的测试类都在Java Discord API框架中测试某种类型的事件处理程序,因此我创建了一个名为GenericEventTest
的顶级类:
公共抽象类GenericEventTest{
@嘲弄
受保护的GenericeEventMock;
@嘲弄
受保护的JDA-jdaMock;
受保护的GenericEventTest(){
initMocks(this);
给定(eventMock.getJDA())
.willReturn(jdaMock);
}
}
我希望实现一个高级模拟,使事件以多态方式适合我的测试类,然后将指定的given()
命令放在它所属的类中,因为我的所有测试都重复这一行。
接下来,我意识到我所有的测试都是测试与Discord中的消息相关的某种事件。因此,我扩展了GenericEvent
并制作了guildmessageventtest
:
公共抽象类GuidMessageEventSet扩展了GenericeEventSet{
@嘲弄
受保护的GenericGuildMessageEvent事件模拟;
@嘲弄
受保护的文本通道事件通道模拟;
@嘲弄
受保护的MessageAction messageActionMock;
受保护的GuildMessageEventTest(){
超级();
initMocks(this);
给定(eventMock.getChannel())
.willReturn(eventChannelMock);
给定(eventChannelMock.sendMessage(anyString()))
.willReturn(messageActionMock);
}
}
我的想法是在这个类中实现下一个级别的事件,GenericGuildMessageEvent
,它将从genericeEvent
应用相同的gived()
规则,然后在这个类中添加适当的gived()
规则。但我相信我已经发现了我的问题
当我声明@Mock受保护的GenericGuildMessageEvent事件Mock代码>我正在跟踪GenericEventTest
中的GenericEvent eventMock
事件。因此,我声明了GenericGuildMessageEvent
实例,但我没有保留GenericEventTest
中附加到mock的given()
规则。执行类似于@Mock受保护的GenericGuildMessageEventMock=(GenericGuildMessageEvent)super.eventMock的操作代码>将不起作用,因为用@Mock
注释的对象不能以这种方式合法地强制转换
我的问题是:当Mockito复制超类中GenericEvent
实例所附加的given()
规则时,我如何合法地将GenericEvent
实例上的GenericEvent
强制转换为genericGuidMessageEvent
您的GenericEventTest
中的code>方法,并让guildmessageventtest
实现它。然后将实例字段protectedgenericevent eventMock
从基类移动到子类。使用getEventMock()
访问基类中的模拟。注意,MockitoAnnotations.initMocks(this)代码>在子类中不再是必需的。这将覆盖基类中的模拟行为
// 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);
}
}