Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Junit5:动态断言在动态测试中工作异常_Java_Junit5 - Fatal编程技术网

Java Junit5:动态断言在动态测试中工作异常

Java Junit5:动态断言在动态测试中工作异常,java,junit5,Java,Junit5,我正在使用Junit5。我想实现一个动态测试,其中测试用例在YAML文件中定义。现在我遇到了一个问题作为标题 查看我的示例代码: @Test public void t1() throws Exception { java.lang.reflect.Method method = org.junit.jupiter.api.Assertions.class.getMethod("assertEquals", int.class, int.class); method.invoke

我正在使用Junit5。我想实现一个动态测试,其中测试用例在YAML文件中定义。现在我遇到了一个问题作为标题

查看我的示例代码:

@Test
public void t1() throws Exception {
    java.lang.reflect.Method method = org.junit.jupiter.api.Assertions.class.getMethod("assertEquals", int.class, int.class);
    method.invoke(null, 1, 5);
}

@TestFactory
Collection<DynamicTest> dynamicTests() {
    DynamicTest[] list = new DynamicTest[1];
    list[0] = DynamicTest.dynamicTest("dt1", new Executable() {
        @Override
        public void execute() throws Throwable {
            java.lang.reflect.Method method = org.junit.jupiter.api.Assertions.class.getMethod("assertEquals", int.class, int.class);
            method.invoke(null, 1, 50);
        }
    });
    return Arrays.asList(list);
}
@测试
public void t1()引发异常{
java.lang.reflect.Method=org.junit.jupiter.api.Assertions.class.getMethod(“assertEquals”,int.class,int.class);
调用(null,1,5);
}
@试验工厂
集合动态测试(){
DynamicTest[]列表=新的DynamicTest[1];
列表[0]=DynamicTest.DynamicTest(“dt1”,新的可执行文件(){
@凌驾
public void execute()抛出可丢弃的{
java.lang.reflect.Method=org.junit.jupiter.api.Assertions.class.getMethod(“assertEquals”,int.class,int.class);
方法调用(null,1,50);
}
});
返回数组.asList(list);
}
在示例代码中,我定义了一个静态测试用例t1和一个动态测试用例caes dt1。在这两个测试中,我只做一个动态断言

但从测试结果来看:

Failures (2):
  JUnit Jupiter:TestRunner:t1()
    MethodSource [className = 'com.mycompany.test.TestRunner', methodName = 't1', methodParameterTypes = '']
    => org.opentest4j.AssertionFailedError: expected: <1> but was: <5>
       org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:52)
       org.junit.jupiter.api.AssertEquals.failNotEqual (AssertEquals.java:197)
       org.junit.jupiter.api.AssertEquals.assertEquals (AssertEquals.java:154)
       org.junit.jupiter.api.AssertEquals.assertEquals (AssertEquals.java:149)
       org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:305)
       sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
       sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
       java.lang.reflect.Method.invoke(Method.java:498)
       com.mycompany.test.TestRunner.t1(TestRunner.java:82)
       [...]
  JUnit Jupiter:TestRunner:dynamicTests():dt1
    MethodSource [className = 'com.mycompany.test.TestRunner', methodName = 'dynamicTests', methodParameterTypes = '']
    => java.lang.reflect.InvocationTargetException
       sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
       sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
       java.lang.reflect.Method.invoke(Method.java:498)
       com.mycompany.test.TestRunner$1.execute(TestRunner.java:96)
       org.junit.jupiter.engine.descriptor.JupiterTestDescriptor. executeAndMaskThrowable (JupiterTestDescriptor.java:141)
       org.junit.jupiter.engine.descriptor.DynamicTestTestDescriptor. execute(DynamicTestTestDescriptor.java:41)
       org.junit.jupiter.engine.descriptor.DynamicTestTestDescriptor. execute(DynamicTestTestDescriptor.java:24)
       org.junit.platform.engine.support.hierarchical. HierarchicalTestExecutor$NodeExecutor.lambda$executeRecursively$3 (HierarchicalTestExecutor.java:112)
       org.junit.platform.engine.support.hierarchical.SingleTestExecutor. executeSafely(SingleTestExecutor.java:66)
       [...]
故障(2):
junitjupiter:TestRunner:t1()
MethodSource[className='com.mycompany.test.TestRunner',methodName='t1',methodParameterTypes=']
=>org.opentest4j.AssertionFailedError:应为:但为:
org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:52)
org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197)
org.junit.jupiter.api.AssertEquals.AssertEquals(AssertEquals.java:154)
org.junit.jupiter.api.AssertEquals.AssertEquals(AssertEquals.java:149)
org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:305)
sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
com.mycompany.test.TestRunner.t1(TestRunner.java:82)
[...]
junitjupiter:TestRunner:dynamicTests():dt1
MethodSource[className='com.mycompany.test.TestRunner',methodName='dynamicTests',methodParameterTypes=']
=>java.lang.reflect.InvocationTargetException
sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
TestRunner$1.execute(TestRunner.java:96)
org.junit.jupiter.engine.descriptor.JupiterTestDescriptor。executeAndMaskThrowable(JupiterTestDescriptor.java:141)
org.junit.jupiter.engine.descriptor.DynamicTestDescriptor。执行(dynamicTestDescriptor.java:41)
org.junit.jupiter.engine.descriptor.DynamicTestDescriptor。执行(dynamicTestDescriptor.java:24)
org.junit.platform.engine.support.hierarchy。HierarchycalTestExecutor$NodeExecutor.lambda$ExecuterUserly$3(HierarchycalTestExecutor.java:112)
org.junit.platform.engine.support.hierarchy.SingleTestExecutor。ExecuteSafley(SingleTestExecutor.java:66)
[...]

对于t1,assert正确显示为
org.opentest4j.AssertionFailedError:expected:but was:
,但对于dt1,assert显示
java.lang.reflect.InvocationTargetException
。有人看到过同样的问题吗?如何将预期的断言结果作为dt1的t1?

检查调用TargetException的原因。它应该读一些大致如下的内容:

Caused by: org.opentest4j.AssertionFailedError: expected: <1> but was: <50>
    at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:52)
    at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197)
    at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:154)
    at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:149)
    at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:305)
    ...
原因:org.opentest4j.AssertionFailedError:应为:但为:
位于org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:52)
位于org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197)
位于org.junit.jupiter.api.AssertEquals.AssertEquals(AssertEquals.java:154)
位于org.junit.jupiter.api.AssertEquals.AssertEquals(AssertEquals.java:149)
位于org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:305)
...
如果您认为这不是期望的行为,请在


如果将
dt1
中的反射方法调用替换为
断言.assertEquals(1,50)您将获得预期的断言失败错误。

如JUnit Jupiter中所述,这个问题的解决方案不是编写自己的反射代码来调用
断言中的方法,而是简单地委托给
ReflectionSupport
,以确保
InvocationTargetException
正确地展开

例如,以下内容在这两种情况下都适用

ReflectionSupport.invokeMethod(method, null, 1, 5);
fup2