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

如何为单元测试模拟父类

澹台欣怿
2023-03-14

所以我有三个类:A、B、C。我需要为类A编写单元测试。

  class A extends B{
   //fields go here ...

   public A(String string, ...){
      super.(string,...);
   }
   //other methods here ...
 }

 class B{
   C stuff;
   //other stuff
 }

因此,C是一种重要的资源(如JDBC或ssh会话)。当然,我在嘲笑C。如何模拟B。想象一下,B有许多扩展它的子类。

我的主要问题是A正在调用super。(...) 。我不想仅仅为了测试而将方法注入到A中。对我来说,这是个糟糕的设计。有没有办法嘲笑父母?

例如,我不能执行类MockB扩展B{…} 然后尝试MockB obj=new A() 这不起作用,因为模拟B和A都是B的子级。


共有2个答案

袁成化
2023-03-14

你想mock B class,这意味着你可能不是在测试B或A。那么你为什么关心它是否调用Super、foo、bar或其他方法呢?你知道jdbc调用了多少方法吗?但是正如你所说,你对嘲笑它没有问题。这里也一样。你只是这样做

B mockOfB = Mockito.mock(B.class);

就是这样。您有一个模拟B,可以测试您喜欢的任何调用。

如果您正在测试,那么为什么不能简单地实例化它呢?B的构造函数是否需要一些静态依赖关系?在这种情况下,您应该重构它或使用类似于powermock的东西(如果您确实无法重构该类)。如果因为B是抽象的而不能实例化它,那么只需在测试中扩展它

井宪
2023-03-14

你真的不应该试图模仿被测试类的超类。虽然一些模拟框架允许“部分模拟”,这可能使部分模拟您实际测试的类成为可能,但这不是一个好主意。

如果类A以及A和B之间的关系足够复杂,您认为需要这样做,那么它们可能根本不应该处于继承关系中。

考虑更改代码,以便将其委托给A而不是扩展。

 类似资料:
  • 问题内容: 我刚开始使用Node,现在正在编写一些单元测试。对于前几个函数,我可以正常运行,但是现在我碰到了一个包含其中的函数。我的函数的简化版本如下所示: 我尝试使用基本节点断言测试库进行测试: 由于执行此操作的时间(以及结果)总是不同的,因此它将始终失败。 在Python中,我可以设置模拟类和对象。有没有一种方法可以在Node中解决此问题而无需将moment.utc()作为函数的参数? 问题答

  • 我还尝试将模拟转换为文档,如下所示 但这会在代码实现内部访问MongoCollection时产生NullpointerException异常。 这两个我都试过了 null 我厌倦了用java编写相同的测试,并在其中进行泛型的转换。 有人在Kotlin有嘲弄泛型类的经验吗?

  • 问题内容: 我正在使用RestTemplate 方法发布到端点。在我的测试文件中,我正在测试POST方法。但是用我目前的测试,我得到了POST请求。在测试文件中发出POST请求时,我需要模拟API的帮助 这是我的主文件 这是我的测试文件 问题答案: 您正在测试DataTestRepo类内部的逻辑,因此您不应模拟它。RestTemplate是DataTestRepo内部的一个依赖项,因此这正是您需要

  • 我有一个示例方法(我需要编写测试用例)如下所示, 我想模拟getConfig方法并返回一个特定的字符串值。getConfig是Kotlin对象中方法,如下所示, 下面是我尝试的测试 我没有得到任何错误,但是getConfig方法没有被嘲笑。执行实际的实现。我也试过使用Powermockito。请帮帮我

  • 我们有一个消息调度程序,它在将消息属性放入带有密钥的Kafka主题队列之前,从消息属性生成一个散列密钥。 这样做是为了消除重复。但是,我不确定如果不实际设置本地集群并检查它的运行是否符合预期,如何能够测试重复数据删除。

  • 我正在使用jUnit 5为我的Spring引导服务类做单元测试。在服务类中,我是自动装配对象,用于调用其他类中的方法。在测试用例中,@Mock没有为@Autow的类创建对象。在这里,我给出了我的代码。 我的服务级别: 我的组件类 : 我的单元测试类: pom.xml 文件 : 在运行此测试时,我在imageProcessor.dummy(name)中获得空指针异常;