簡體   English   中英

Junit5 Intellij IDEA assertsThrows() 拋出 noSuchMethodError

[英]Junit5 Intellij IDEA assertsThrows() throws noSuchMethodError

我正在嘗試在 Junit5 中運行測試,它應該從方法中捕獲異常。 它捕獲 NoSuchMethodError 而不是異常異常。

方法:

public void thisMethodShouldThrowException() throws IllegalArgumentException {
     throw new IllegalArgumentException();
}

測試方法:

@Test
void thisMethodShouldThrowException() throws IllegalArgumentException {
    DBProperties dbProperties = DBProperties.getInstance();
    Assertions.assertThrows(IllegalArgumentException.class,
        ()->dbProperties.thisMethodShouldThrowException());
}

構建.gradle:

dependencies {
    compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.3.0-alpha4'
    compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.11'
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.0.0'
    testCompile group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.0.0'
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.0.0'
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: '5.0.0'
    testCompile("org.junit.vintage:junit-vintage-engine:4.12.0")
}

堆棧跟蹤:

org.opentest4j.AssertionFailedError: Unexpected exception type thrown ==> 
Expected :<java.lang.IllegalArgumentException> 
Actual   :<java.lang.NoSuchMethodError>
<Click to see difference>


at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:59)
at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:38)
at org.junit.jupiter.api.Assertions.assertThrows(Assertions.java:1108)
at pl.javamill.bnbahistory.Controller.DBPropertiesTest.thisMethodShouldThrowException(DBPropertiesTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:167)
at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:83)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null$2(HierarchicalTestExecutor.java:92)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute$3(HierarchicalTestExecutor.java:92)
at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.NoSuchMethodError: pl.javamill.bnbahistory.Controller.DBProperties.thisMethodShouldThrowException()V
at pl.javamill.bnbahistory.Controller.DBPropertiesTest.lambda$thisMethodShouldThrowException$1(DBPropertiesTest.java:24)
at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:50)
... 54 more

Intellij Idea 版本是 2018.2 我也嘗試了最新版本的 Junit5。 我不知道我做錯了什么。 你能幫助我嗎?

我在使用junit-jupiter-api 5.3.2遇到了同樣的錯誤。 一項快速研究表明:

  import static org.junit.jupiter.api.Assertions.assertThrows;
  import org.junit.jupiter.api.Test;
  import org.junit.jupiter.api.function.Executable;
  import org.junit.jupiter.api.function.ThrowingSupplier;

  @Test
  public void testVoidMethod() {
    // works
    Executable supplier = () -> crash();
    assertThrows(NullPointerException.class, supplier);
  }

  @Test
  public void testMethodWithReturnTypeCalledByExecutable() {
    // works
    Executable supplier = () -> wrong();
    assertThrows(NullPointerException.class, supplier);
  }

  @Test
  public void testMethodWithReturnType() {
    // fails
    assertThrows(NullPointerException.class, () -> wrong());
  }

  @Test
  public void testMethodWithReturnTypeCalledByThrowingSupplier() {
    // fails
    ThrowingSupplier<?> supplier = () -> wrong();
    assertThrows(NullPointerException.class, supplier);
  }

  public void crash() {
    throw new NullPointerException();
  }

  public Object wrong() {
    throw new NullPointerException();
  }

assertThrowsThrowingSupplier一起使用會引發NoSuchMethodError

我更新到junit-jupiter-api 5.4.0 API 發生了變化。 不再有以ThrowingSupplier作為參數的assertThrows方法。 只有那些接受Executable留下了。 但是有一些新方法采用名為assertDoesNotThrowThrowingSupplier

最后我更新到junit-jupiter-api 5.5.2

5.4 發行說明提到了類似案例的錯誤修復。 然而,這不是對NoSuchMethodError的解釋。

更新:

如果我通過 Eclipse 的 JUnit 插件運行 JUnit 測試,則會拋出NoSuchMethodError 它使用org.junit.jupiter.api_5.1.0.v20180327-1502.jar而在pom.xml中指定了 JUnit 5.3.2。 在 JUnit 5.3.2 上使用 maven 運行測試成功。

這是我使用 Eclipse 的情況。 我沒有 IntelliJ IDEA。

我正在用我正在編碼的東西查找同樣的問題,我通過將測試方法放入大括號中來解決我的問題,如下所示:

Assertions.assertThrows(IllegalArgumentException.class,
        () -> {dbProperties.thisMethodShouldThrowException();} );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM