我的spark应用程序中有一个方法从MySQL数据库加载数据。该方法看起来如下所示。
trait DataManager {
val session: SparkSession
def loadFromDatabase(input: Input): DataFrame = {
session.read.jdbc(input.jdbcUrl, s"(${input.selectQuery}) T0",
input.columnName, 0L, input.maxId, input.parallelism, input.connectionProperties)
}
}
该方法除了执行jdbc
方法并从数据库加载数据外,其他什么都不做。我该如何测试这种方法呢?标准方法是创建对象session
的模拟,该对象是sparksession
的实例。但是由于sparksession
有一个私有构造函数,所以我无法使用Scalamock来模拟它。
这里的主要问题是,我的函数是一个纯粹的副作用函数(副作用是从关系数据库拉数据),如果我在嘲笑sparksession
时遇到问题,我如何单元测试这个函数。
那么有没有什么方法可以模拟sparksession
或者其他比模拟更好的方法来测试这个方法呢?
在您的情况下,我建议不要模拟SparkSession。这将或多或少地模拟整个函数(您可以无论如何这样做)。如果您想测试这个函数,我的建议是运行一个嵌入式数据库(如H2),并使用一个真正的SparkSession。为此,您需要向DataManager
提供SparkSession。
未经测试的草图:
您的代码:
class DataManager (session: SparkSession) {
def loadFromDatabase(input: Input): DataFrame = {
session.read.jdbc(input.jdbcUrl, s"(${input.selectQuery}) T0",
input.columnName, 0L, input.maxId, input.parallelism, input.connectionProperties)
}
}
您的测试用例:
class DataManagerTest extends FunSuite with BeforeAndAfter {
override def beforeAll() {
Connection conn = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");
// your insert statements goes here
conn.close()
}
test ("should load data from database") {
val dm = DataManager(SparkSession.builder().getOrCreate())
val input = Input(jdbcUrl = "jdbc:h2:~/test", selectQuery="SELECT whateveryounedd FROM whereeveryouputit ")
val expectedData = dm.loadFromDatabase(input)
assert(//expectedData)
}
}
我开始在我的项目中实践TDD,作为背景,它也包含遗留代码。我们使用Mockito作为一个模拟框架,并遵循Spring MVC方法。 有时,类用许多不同的对象作为属性实现。这些服务中有一些简单的方法,例如。 将使用许多对象来完成其职责 更新并保存事务 推进业务流程 关闭其他挂起的操作 但是,在执行这些操作时,该方法需要调用不同的来获取和更新事务、获取业务流程ID、获取挂起的事务(并保存其更新)。这意
我面临一个问题,而嘲笑jUnit测试的东西。 情况如下: 类A实现了来自第三方jar的接口,并且需要实现method1。除了method1之外,A还包含method2,它是从method1调用的。method2本身调用一些外部服务。 我想单元测试方法1。 方法1接受输入,比如X。X有一个包裹在里面的输入变量,比如var1。var1由方法1中的逻辑使用,方法1在X中设置另一个变量,比如var2。 所
我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient
遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte
正确的问题是:如何用Guzzle5抛出异常?或者,如何用Guzzle 5测试catch块?
我想对一个组件的功能进行单元测试。因此,我需要一个模拟服务(根据角度测试指南)。 这里是我的测试床: 那么,嘲笑服务价值的正确方法是什么呢? 弗兰克