首页 > 解决方案 > 使用 Groovy 和 JUnit 5 断言时出现 MissingMethodException

问题描述

尝试使用 JUnit 5 类断言,特别是带有 Groovy 的 assertAll()。

Basic Java 证明了以下语法:

@Test
public void someTest() {
    assertAll('heading',
        () -> assertTrue(firstName),
        () -> assertTrue(lastName)
    );
}

由于我坚持使用不支持 lambdas 的 Groovy v2.4,所以我所做的看起来像(尝试了几个选项,但是所有这些都提供了相同的错误):

@Test
void 'Some test'() {
    assertAll('heading',
        { -> assert firstName },
        { -> assert lastName }
    )
}

错误信息:

groovy.lang.MissingMethodException:
No signature of method: static org.junit.jupiter.api.Assertions.assertAll() is applicable for argument 
types: (path.GeneralTests$_Some_test_closure10...)
values: [path.GeneralTests$_Some_test_losure10@1ef13eab, ...]

看起来问题出在 assertAll() 方法本身,异常非常明显,但是要获得可能的解决方案是一个相当大的挑战,因为我最近不得不从 Python 切换到 Groovy。

确实,我将来会用 Groovy 学习一些课程,但是你知道,你总是必须提供昨天的结果。

非常感谢您的建议!

标签: groovyjunitjunit5assertion

解决方案


在这种特殊情况下,您需要将 Groovy 闭包org.junit.jupiter.api.function.Executable显式转换为接口:

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.function.Executable

import static org.junit.jupiter.api.Assertions.*

class Test {
    @Test
    void 'Some test'() {
        assertAll('heading',
                { assertTrue(true) } as Executable,
                { assertFalse(false) } as Executable)
    }
}

推荐阅读