Java Junit5:动态断言在动态测试中工作异常
我正在使用Junit5。我想实现一个动态测试,其中测试用例在YAML文件中定义。现在我遇到了一个问题作为标题 查看我的示例代码: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
@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