当前位置: 首页 > 知识库问答 >
问题:

单元测试和太多的模拟

程仲卿
2023-03-14

我开始在我的项目中实践TDD,作为背景,它也包含遗留代码。我们使用Mockito作为一个模拟框架,并遵循Spring MVC方法。

有时,Service类用许多不同的DAO对象作为@autowired属性实现。这些服务中有一些简单的方法,例如CompleteTransaction

CompleteTransaction将使用许多DAO对象来完成其职责

  • 更新并保存事务
  • 推进业务流程
  • 关闭其他挂起的操作

但是,在执行这些操作时,该方法需要调用不同的DAO来获取和更新事务、获取业务流程ID、获取挂起的事务(并保存其更新)。这意味着对该方法进行单元测试使我添加了许多@mock属性。我需要在测试完成之前设置模拟对象来测试某个条件。

共有1个答案

姬飞飙
2023-03-14

我想当你发现自己被太多的嘲笑时,你通常会想做两件事。这些不是必要的容易,但你可能会发现它们很有帮助。

1)尽量让你的方法和类更小。我认为干净的代码说有两个规则,类应该更小。类应该更小。这是有道理的,因为当你测试的单元(方法和类)变小时,依赖关系也会变小。当然,你最终会得到更多的测试,但它们在每次测试中的设置会更少。

2)看看Demeter的规律(https://en.wikipedia.org/wiki/Law_of_demeter)。有一系列规则,但基本上,您希望避免长字符串的属性/方法调用。objA=objB.propertya.somemethod().propertyc;如果您需要模拟所有这些对象来获取objA,您将需要进行大量的设置。但是如果您可以用objA=objB.newproperty;替换,那么您只需要模拟objB,它就是一个属性。

这些都不是银弹,但希望您可以在您的项目中使用其中的一些想法。

 类似资料:
  • 单元测试 单元测试仅依赖于源代码,是测试代码逻辑是否符合预期的最简单方法。 运行所有的单元测试 make test 仅测试指定的package # 单个package make test WHAT=./pkg/api # 多个packages make test WHAT=./pkg/{api,kubelet} 或者,也可以直接用go test go test -v k8s.io/kubernet

  • 我的spark应用程序中有一个方法从MySQL数据库加载数据。该方法看起来如下所示。 该方法除了执行方法并从数据库加载数据外,其他什么都不做。我该如何测试这种方法呢?标准方法是创建对象的模拟,该对象是的实例。但是由于有一个私有构造函数,所以我无法使用Scalamock来模拟它。 这里的主要问题是,我的函数是一个纯粹的副作用函数(副作用是从关系数据库拉数据),如果我在嘲笑时遇到问题,我如何单元测试这

  • 我面临一个问题,而嘲笑jUnit测试的东西。 情况如下: 类A实现了来自第三方jar的接口,并且需要实现method1。除了method1之外,A还包含method2,它是从method1调用的。method2本身调用一些外部服务。 我想单元测试方法1。 方法1接受输入,比如X。X有一个包裹在里面的输入变量,比如var1。var1由方法1中的逻辑使用,方法1在X中设置另一个变量,比如var2。 所

  • 问题内容: 在Angular中,所有内容似乎都具有陡峭的学习曲线,并且对Angular应用程序进行单元测试绝对不能逃脱这种范例。 当我开始使用TDD和Angular时,我觉得我花了两倍(可能更多)的时间来弄清楚如何测试,甚至花更多的时间来正确地设置测试。但是正如Ben Nadel 在他的博客中所说的那样,角度学习过程存在起伏。他的图表绝对是我在Angular的经历。 但是,随着我在学习Angula

  • 我在尝试包装我的代码以用于单元测试时遇到了一些问题。问题是。我有接口IHttpHandler: 现在很明显,我将在Connection类中有一些方法,这些方法将从my后端检索数据(JSON)。但是,我想为这个类编写单元测试,显然我不想编写针对真实后端的测试,而是一个被嘲弄的测试。我曾尝试谷歌一个很好的答案,但没有很大的成功。我以前可以并且曾经使用过Moq来模拟,但是从来没有在像HttpClient

  • 遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte