首页 > 解决方案 > 单元测试 Lambda 表达式

问题描述

我有一个如下所示的方法,它又调用了多个私有方法,我不会在这里发布。

@Bean
    public CommandLineRunner registerStartersAndReaders(final Vertx vertx, final SpringVerticleFactory springVerticleFactory,
                                                        final SpringUtil springUtil, final GslConfig gslConfig) {
        return args -> {
            // Scan all the beans annotated with the @ElasticsearchBatchDataListener annotation.
            List<Pair<Object, Method>> listenerMethods = springUtil.getListenerMethods();

            // Deploy the starters per listener.
            deployVerticle(listenerMethods, jsonConfig -> deployStarterVerticle(vertx, springVerticleFactory, jsonConfig), config);

            // Deploy the reader verticles.
            deployVerticle(listenerMethods, jsonConfig -> deployReaderVerticle(vertx, springVerticleFactory, jsonConfig), config);
            setupTriggers(vertx, listenerMethods, config);
        };
    }

然后我有一个测试方法:

@Test
    public void registerStartersAndReadersTest() {
        when(springUtil.getListenerMethods()).thenReturn(value);
        CommandLineRunner runner = config.registerStartersAndReaders(vertx, springVerticleFactory, springUtil, config);
        assertNotNull(runner);
    }

这里,所有传入方法调用的参数都是 mocks。问题是,当我运行这个测试时,它通过了,但它返回了值而没有进入私有方法,因为它只返回“args”。

有人可以指导我如何让我的测试涵盖所有可能的代码。我不应该更改我的测试代码。

标签: unit-testinglambdajava-8

解决方案


我认为您对 lamba 表达感到困惑,相信我一开始就很困惑。但是一旦你熟练掌握它,它就会变得轻而易举。

所以在这里你得到了CommandLineRunnerfrom 方法registerStartersAndReaders调用的实例,而你的 assertNotNullPASS因为你有非空实例,但是直到你调用没有任何run方法的方法FunctionalInterface才会被执行。

添加runner.run(args)以执行测试用例中的方法。


推荐阅读