gpt4 book ai didi

java - Mockito 无法模拟 Hadoop Mapper 上下文

转载 作者:可可西里 更新时间:2023-11-01 15:20:15 29 4
gpt4 key购买 nike

所以我正在尝试使用 Mockito 为我的 Hadoop 映射函数创建一个单元测试。我已经正确地创建了 Mapper 类:

class XmlMapper extends Mapper[LongWritable, Text, Text, LongWritable] {

override def map(key: LongWritable, value: Text, context: Mapper[LongWritable, Text, Text, LongWritable]#Context): Unit = {
//does stuff
}
}

然后我有以下测试:

import org.apache.hadoop.io.{LongWritable, Text}
import org.scalatest.FlatSpec
import org.scalatest.mockito.MockitoSugar
import org.mockito.Mockito.verify
import org.mockito.Mockito.times

class XmlMapperTest extends FlatSpec with MockitoSugar {

"XmlMapper" should "output" in {
val mapper = new XmlMapper
val context = mock[mapper.Context]
//so far does nothing yet
}
}

但是我得到以下错误:

- should output *** FAILED ***
[info] org.mockito.exceptions.base.MockitoException: Mockito cannot mock this class: class org.apache.hadoop.mapreduce.Mapper$Context.
[info]
[info] Mockito can only mock non-private & non-final classes.
[info] If you're not sure why you're getting this error, please report to the mailing list.

这没有意义,因为 Mapper.Context 是一个公共(public)抽象类。

这里是总的堆栈跟踪:

[info] Underlying exception : java.lang.UnsupportedOperationException: Cannot define class using reflection
[info] at org.scalatest.mockito.MockitoSugar.mock(MockitoSugar.scala:73)
[info] at org.scalatest.mockito.MockitoSugar.mock$(MockitoSugar.scala:72)
[info] at XmlMapperTest.mock(XmlMapperTest.scala:7)
[info] at XmlMapperTest.$anonfun$new$1(XmlMapperTest.scala:11)
[info] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[info] at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)
[info] at org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83)
[info] at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
[info] at org.scalatest.Transformer.apply(Transformer.scala:22)
[info] at org.scalatest.Transformer.apply(Transformer.scala:20)

最佳答案

看来您使用的是旧版本的 mockito-core,鉴于您使用的是 Scala,我强烈建议您使用最新版本的 mockito-scala

此外,作为一种良好做法,您应该尽可能避免模拟不属于您的类。更好的方法是将与第 3 方的交互包装在一个类(或一组类)中,并进行集成测试以证明它们按预期工作。

在系统的其余部分,你注入(inject)这些类,因此,为了测试,你模拟这些类,这允许你控制(和简化)暴露的接口(interface),并最大限度地减少 future 版本的中断派对库更改其 API。

有关更多详细信息,请查看此 StackOverflow answer还有这个post在 Mockito 博客上

关于java - Mockito 无法模拟 Hadoop Mapper 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54890947/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com