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

如何测试调用超类方法的时间?

宋宏儒
2023-03-14

我试图在下面的类中进行测试,但得到了“org.mockito.exceptions.base.MockitoException:只有void方法才能执行任何操作()!”当我试图嘲笑时,我得到了nullpointerException。

@Configuration

@Profile("cloud")
public class PsqlConfiguration extends AbstractCloudConfig {

    @Bean
    public DataSource dataSource() {
        return connectionFactory().dataSource();
    }
}

笔试=

@RunWith(MockitoJUnitRunner.class)
class PsqlConfiguration extends AbstractCloudConfig{

    @Test
    void dataSource() {
        PsqlConfiguration ch = Mockito.spy(new PsqlConfiguration());
        Mockito.doNothing().when((AbstractCloudConfig)ch).connectionFactory();
        ch.dataSource();
    }

模拟测试

@RunAnd(MockitoJUnitRunner.class)

类PsqlConfigurationTest{

@InjectMocks
PsqlConfiguration psqlConfiguration = new PsqlConfiguration();

AbstractCloudConfig config = Mockito.mock(AbstractCloudConfig.class);

@Test
void dataSource() {
    DataSource dataSource = Mockito.mock(DataSource.class);
    Cloud cloud = Mockito.mock(Cloud.class);
    ServiceConnectionFactory factory = new CloudServiceConnectionFactory(cloud);
    Mockito.when(config.connectionFactory()).thenReturn(factory);
    System.out.println(config.connectionFactory());
    Mockito.when(config.connectionFactory().dataSource()).thenReturn(dataSource);
    assertNull(psqlConfiguration.dataSource()); // This gives null

}

}

共有1个答案

杭英杰
2023-03-14

从您的测试来看,我认为您希望验证()配置的dataSource()方法正在被调用。如果是这样,您可能需要以下内容:

@Test
void dataSource() {
    PsqlConfiguration ch = Mockito.spy(new PsqlConfiguration());
    DataSource mockDs = Mockito.mock(DataSource.class);
    Mockito.doReturn(mockDs).when(ch).dataSource();
}

出现错误的原因是AbstractCloudConfig类的dataSource()方法返回DataSource,而不是val。您只能使用do某物()来模拟无效方法。

如果你真的想模仿超类,你可以这样做:

@Test
void dataSource() {
    PsqlConfiguration ch = Mockito.spy(new PsqlConfiguration());
    DataSource mockDs = Mockito.mock(DataSource.class);
    ConnectionFactory mockFactory = Mockito.mock(ConnectionFactory.class);
    Mockito.doReturn(mockDs).when(ch).dataSource();
    Mockito.doReturn(mockFactory).when((AbstractCloudConfig)ch).connectionFactory();
    ch.dataSource();
    verify(ch).connectionFactory();
}

然而,请注意,这个测试在编写时毫无意义。您的配置类不会执行任何不是来自框架的代码(就您编写的代码而言,配置是由Spring加载的)。测试应该只测试您自己的代码,而不是底层框架(它有自己的测试)。

我从你的评论中看到:

如果我直接模拟子类方法,那么它的工作原理,但代码覆盖率是0%,所以我想模拟连接工厂(). dataSource()。所以它提供了100%的代码覆盖率,但是它提供了NullPointerExcure

你这么做只是为了代码覆盖率。这并不是一个好的做法,因为:

  1. 您正在扩充代码库,以便为不属于代码职责范围的东西编写测试。
  2. 100%的覆盖率并不意味着代码库没有bug。

现在,如果您的配置源也对数据源(除了检索它之外)做了一些事情,那么您可以为此编写一个测试,以断言代码中的所有内容都正确地使用了它。然而,正如文中所述,它在任何方面都没有真正的帮助。

 类似资料:
  • 问题内容: 我有一些应调用某些输入的方法。不幸的是,测试这些情况会导致JUnit终止!将方法调用放在新的Thread中似乎无济于事,因为终止JVM不仅终止当前线程。有什么通用的模式可以处理吗?例如,我可以用存根替换吗? [编辑]有问题的类实际上是我要在JUnit中测试的命令行工具。也许JUnit根本不是适合该工作的工具?欢迎提出补充回归测试工具的建议(最好是与JUnit和EclEmma很好地集成在

  • 问题内容: 我有两节课: 我有一个实例B。如何调用A.method()从b?基本上,效果与super.method()从调用相同B。 但是上述代码仍会调用。 问题答案: 如果使用的是JDK7,则可以使用MethodHandle实现此目的:

  • 问题内容: 我在某些测试中使用Mockito。 我有以下课程: 我只想模拟的第二个调用。第一次调用必须调用real方法。有没有办法做到这一点? 问题答案: Mockito不支持此功能。 这可能不是你要寻找的答案,但是你看到的是不采用设计原则的症状: 偏重于继承而不是继承 如果你提取策略而不是扩展超类,那么问题就不存在了。 但是,如果不允许你更改代码,但无论如何都必须对其进行测试,并且以这种尴尬的方

  • 我正在学习java入门课程,我们刚刚开始学习继承。我正在做一项任务,要求我们创建一个具有名称和年龄的“Pet”超类;和三个子类,每个都有自己独特的特征(我选择了“狗”、“猫”和“鸟”)。在我们构建了所有这些之后,我们将创建一个主类来测试一切,这就是我遇到问题的地方。我试图为这些独特的特性调用

  • 实际上,它的测试如果eat方法对宠物有效,但我也需要检查feedPet方法对玩家也有效。 任何想法或建议都非常感谢。

  • 我创建了一个名为的类,它以分数形式表示有理数(带有分子和分母)。我还创建了一个静态方法,它接受两个并在其他私有静态方法的帮助下将它们相加(、)。我正在使用类(这有主要方法)测试我的类。分数添加是不正确的。 我想调试我的 add 方法(使用 Netbeans 调试器),但是当我点击调试时,它只显示 main 方法中的变量,而不显示 方法中的变量。我无法“看到”我的方法本身的计算。有没有办法调试不在主