我有一个java代码,我在其中调用scala对象的方法(依赖库的)。为了编写单元测试,我想模拟scala对象的方法调用
Operations.Scala
object Operations {
def load(spark: SparkSession, path: String): Dataset[Row] = {
}
}
public class Main {
public void callMethod() {
Dataset<Row> df = Operations.load(sparkSession, path);
}
}
下面是通常如何完成的...我将用scala写它,因为java语法要冗长得多(坦白地说,我不太记得它),但这是相同的想法。
trait Operations {
def load(s: SparkSession, path: String): DataSet[Row]
}
object Operations extends Operations {
def load(s: SparkSession, path: String) = ??? // implementation here
}
class Main(operations: Operations = Operations) {
callMethod(): Unit = {
val df = operations.load(sparkSession, path);
...
// do stuff
}
}
然后在测试中编写(这是使用mockito
/scalatest
,但对于用于测试的任何库都是同样的想法):
val ops = mock[Operations]
when(ops.load(any, any)).thenReturn(whatever)
new Main(ops).callMethod(mock[SparkSession], "/foo/bar")
这种方法称为“依赖项注入”:您的main
类对operations
有一个“依赖项”,它现在是在运行时“注入”的,而不是像您的代码片段那样硬编码。这允许您使用不同的依赖实例进行生产(实际的操作
对象)和测试(模拟)运行。
最好是让这个方法返回实际的结果,让调用者来处理副作用。那么您就可以轻松地测试它是否产生了您所期望的结果:
new Main(ops).callMethod(mock[SparkSession], "/foo/bar") shouldBe "ExpectedFooResult"
下面是我要为其创建测试的类和方法: 具体地说,我希望模拟getAnalytics.getAll(),这样它就会返回一个我已经定义的字符串。而不是方法执行它的任务。这是我的代码:
所以我想做一些事情 但我得到了空异常
问题内容: 我刚刚开始模拟应用程序的不同层。我到了一个地步,我的一个模拟对象在调用最终类静态方法时返回NPE。有没有解决的办法? 例如 问题答案: 您必须同时使用PowerMock和Mockito。 我不明白您的代码段正在尝试做什么,但是以下代码段允许类的静态方法返回模拟的对象。也许这会为您指明正确的方向 在课堂上: 在您的测试方法中:
我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?
如何模拟返回已强制转换的模拟对象的方法。 试验方法。
我可以使用Powermock中的,但我想知道Spock有没有办法做到这一点。