Java Mockito-父(抽象)类中的mock值?

Java Mockito-父(抽象)类中的mock值?,java,android,unit-testing,kotlin,mockito,Java,Android,Unit Testing,Kotlin,Mockito,我想为GetEventPlannersRequest类编写测试 这个班级看起来: class GetEventPlannersRequest(requestIn: GetEventPlannersRequest.Request, okListener: RabbitResponse.RabbitResponseListener<GetEventPlannersResponse>,

我想为GetEventPlannersRequest类编写测试

这个班级看起来:

    class GetEventPlannersRequest(requestIn: GetEventPlannersRequest.Request,
                              okListener: RabbitResponse.RabbitResponseListener<GetEventPlannersResponse>,
                              errorListener: RabbitResponse.RabbitErrorListener
) : AbstractWfmRabbitRequest<GetEventPlannersRequest.Request, GetEventPlannersResponse>(requestIn, GetEventPlannersResponse::class.java, okListener, errorListener) {

    override fun getExchange(): String {
        return RabbitModuleConfig.EXCHANGE_MOBILE_OUT
    }

    override fun getRoutingKey(): String {
        return WfmRabbitModuleConfig.ROUTING_KEY_WFM_EVENT_PLANNERS
    }

    override fun getType(): String {
        return WfmRabbitModuleConfig.TYPE_WFM_EVENT_PLANNERS
    }
类GetEventPlannerRequest(requestIn:GetEventPlannerRequest.Request,
okListener:RabbitResponse.RabbitResponseListener,
errorListener:RabbitResponse.RabbitErrorListener
):AbstractWfmRabbitRequest(requestIn、GetEventPlannersResponse::class.java、okListener、errorListener){
重写getExchange():字符串{
返回RabbitModuleConfig.EXCHANGE\u MOBILE\u OUT
}
重写getRoutingKey():字符串{
返回WfmRabbitModuleConfig.ROUTING\u KEY\u WFM\u EVENT\u PLANNERS
}
重写getType():字符串{
返回WfmRabbitModuleConfig.TYPE\u WFM\u EVENT\u PLANNERS
}
所以在测试中我做了如下的事情:

@Mock
lateinit var requestIn: GetEventPlannersRequest.Request

@Mock
lateinit var okListener: RabbitResponse.RabbitResponseListener<GetEventPlannersResponse>

@Mock
lateinit var errorListener: RabbitResponse.RabbitErrorListener

@Before
fun before() {
    MockitoAnnotations.initMocks(this)
}

@Test
fun getExchange() {
    val getEventPlannersRequest = GetEventPlannersRequest(requestIn, okListener, errorListener)

    assertEquals(getEventPlannersRequest.exchange, "mobile.outgoing")
}
@Mock
lateinit var requestIn:GetEventPlannerRequest.Request
@嘲弄
lateinit变量okListener:RabbitResponse.RabbitResponseListener
@嘲弄
lateinit变量errorListener:RabbitResponse.RabbitErrorListener
@以前
之前的乐趣{
initMocks(this)
}
@试验
乐趣交换(){
val GetEventPlannerRequest=GetEventPlannerRequest(请求输入、确认侦听器、错误侦听器)
assertEquals(getEventPlannersRequest.exchange,“mobile.outgoing”)
}
问题出在哪里?

问题是父类GetEventPlannersRequest

  public AbstractRabbitRequest(K body, Class<T> clazz, RabbitResponse.RabbitResponseListener<T> listener, RabbitResponse.RabbitErrorListener error) {
    super(FS.get().getSession().getTerminalId(), body, clazz, listener, error);
}
public AbstractRabbitRequest(K body,Class clazz,RabbitResponse.RabbitResponseListener侦听器,RabbitResponse.RabbitErrorListener错误){
super(FS.get().getSession().getTerminalId(),body,clazz,listener,error);
}
它引发了java.lang.NullPointerException

是否可以以某种方式模拟它?或者我需要以某种方式重构它?

更新:
现在,我添加了额外的构造函数:

 public AbstractRabbitRequest(String terminalId, K body, Class<T> clazz, RabbitResponse.RabbitResponseListener<T> listener, RabbitResponse.RabbitErrorListener error) {
    super(terminalId, body, clazz, listener, error);
}
public AbstractRabbitRequest(字符串terminalId,K body,类clazz,RabbitResponse.RabbitResponseListener侦听器,RabbitResponse.RabbitErrorListener错误){
super(termalid、body、clazz、listener、error);
}

因此,我也可以模拟terminalId并对其进行测试,但如果可以模拟它,我还想知道如何:)

我认为您应该重构它。要实例化请求类,您需要将terminalId作为参数传递。构造函数不应尝试单独访问单例状态。一旦您就像这个改变一样。@GennadiiSaprykin我的意见是这也应该被重构,但是…我正在用Kotlin编写新的模块,不想在没有太多时间的情况下改变到太多的现有实现。你现在对额外的构造函数怎么看?这是个好主意,是的。现在只需添加那个构造函数,但最终你应该迁移将您的实际代码库添加到该构造函数中,并去掉使用单例的构造函数。您还可以让构造函数将
FS.get()
将返回的内容作为参数,然后可以对其进行模拟,同时仍然在构造函数中维护一些“实现细节”。@JimmyB我确实这样做了。用“更新”查看底部