我有一段java代码,其中我调用了一个scala对象的方法(属于一个依赖库)。为了编写单元测试,我想模拟scala对象的方法调用
Operations.scala
object Operations {
def load(spark: SparkSession, path: String): Dataset[Row] = {
}
}Main.java
public class Main {
public void callMethod() {
Dataset<Row> df = Operations.load(sparkSession, path);
}
}我想为callMethod()编写一个单元测试,从而模拟Operations.load scala调用。我没有找到一种方法来做这件事。
任何帮助都将不胜感激。
发布于 2021-06-23 19:09:53
如果您希望更改callMethod方法的签名,一种可能的解决方案是使用接口和依赖项注入。
创建一个为您提供Dataset[Row]的接口
trait ObtainDataSet {
def obtain: DataSet[Row]
}然后让你的callMethod有一个接受这个接口的参数:
public void callMethod(ObtainDataSet obtainDataSet) {
Dataset<Row> df = obtainDataSet.obtain;
}然后在生产代码中使用Operations.load方法注入真正的实现:
class ObtainDataSetImpl(spark: SparkSession, path: String) extends ObtainDataSet {
override def obtain: Dataset[Row] = Operations.load(sparkSession, path)
}但是,您可以很容易地将该生产实现替换为测试中的特别实现。你甚至不需要使用模拟框架:
class MyMock extends ObtainDataSet {
override def obtain: DataSet[Row] = ??? // something useful for tests.
}但如果您愿意,通常会使用ScalaMock
https://stackoverflow.com/questions/68097510
复制相似问题