Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种方法可以合法地投射Mockito mock对象?_Java_Unit Testing_Mockito_Polymorphism_Discord Jda - Fatal编程技术网

Java 有没有一种方法可以合法地投射Mockito mock对象?

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框架中

我用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框架中测试某种类型的事件处理程序,因此我创建了一个名为
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);
    }

}