JUnit测试得到了带有java.lang.Exception的initializationError:找不到匹配

时间:2017-12-08 09:01:28

标签: spring unit-testing junit

运行JUnit测试时,它给出了一个initializationError:找不到匹配的测试。像这样:

prodapi-main-junit
initializationError(org.junit.runner.manipulation.Filter)
java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=testCreateSite], {ExactMatcher:fDisplayName=testCreateSite(com.company.product.api.web.rest.HostControllerTest)], {LeadingIdentifierMatcher:fClassName=com.company.product.api.web.rest.HostControllerTest,fLeadingIdentifier=testCreateSite]] from org.junit.internal.requests.ClassRequest@3c0f93f1
    at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createFilteredTest(JUnit4TestLoader.java:77)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:68)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

测试代码如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ProductApplication.class)
@WebAppConfiguration
public class HostControllerTest{
    @Test
    public void testCreateSite() throws Exception {
    ......
}
}

加载类,运行良好应该没问题。还有与此类似的其他模块,它们可以正常运行。

我检查了可能的原因:

  1. 有人说缺少"测试"注释导致此错误。 虽然代码确实有你可以看到的注释。
  2. 有些人说应该将构建路径配置为在测试源文件夹下进行构建,获取测试类并导出。 我仔细检查过的配置也很有用。
  3. 也许在编译时没有生成测试类,而我可以在目标文件夹下看到那些测试类。
  4. 我不知道是否有任何其他可能的事情可以像这样得到Junit测试错误。也许我应该检查类加载器?

8 个答案:

答案 0 :(得分:3)

用谷歌搜索了一些答案。我发现这个案例有一个问题如下: https://github.com/junit-team/junit4/issues/1277(FilterRequest可能会隐藏测试的真正失败原因(异常)) 这是我尝试的步骤:
1.当选择Junit项目名称时,不要单独选择测试功能,同时在测试选项卡上选择“在所选项目中运行所有测试”选项  点击Run->“运行(调试)配置”后 2.您可以按如下方式获取错误的详细信息:

initializationError(com.company.product.api.web.rest.HostControllerTest)
java.lang.Exception: Method testSetDBConfiguration should have no parameters
    at org.junit.runners.model.FrameworkMethod.validatePublicVoidNoArg(FrameworkMethod.java:76)
    at org.junit.runners.ParentRunner.validatePublicVoidNoArgMethods(ParentRunner.java:155)

3.根据上面eclipse给出的细节,我删除了该函数的参数,initializedError刚刚消失。

所以这个问题上升是由于新添加的测试功能有不必要的输入参数。 错误的代码:

@Test
public void testSetDBConfiguration(String name) throws Exception {

已更改为

@Test
public void testSetDBConfiguration() throws Exception {

答案 1 :(得分:1)

PowerMock @RunWith(PowerMockRunner.class)遇到了同样的问题,然后发现我的@Test是错误的实现。正在使用 import org.junit.jupiter.api.Test;

我切换到import org.junit.Test;,这为我解决了这个问题。

答案 2 :(得分:0)

我遇到了类似的问题,后来意识到我的主要spring boot应用程序配置没有扫描其中包含我的测试类的软件包。

主要类别是扫描软件包-{“ com.mycmp.prj.pkg1”,“ com.mycmp.prj.pkg2”,“ com.mycmp.dependentprj.pkg5”}

测试类位于软件包-com.mycmp.prj.pkg3

通过修复基本软件包以扫描当前项目中的所有软件包并仅扫描依赖库中所需的有限软件包来解决问题


java主类

@SpringBootApplication(scanBasePackages = {“ com.mycmp.prj.pkg1”,“ com.mycmp.prj.pkg2”,“ com.mycmp.dependentprj.pkg5”}) 公共类MyApplication扩展了SpringBootServletInitializer {

public static void main(final String[] args) {
    SpringApplication.run(MyApplication.class, args);
}

@Override
protected SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
    return application.sources(MyApplication.class);
}

@Bean
public FilterRegistrationBean<Filter> customFilters() {
  final FilterRegistrationBean<Filter> registration = new 
  FilterRegistrationBean<>();
  final Filter myFilter = new ServicesFilter();
  registration.setFilter(myFilter);
  registration.addUrlPatterns("/myurl1/*", "/myurl2/*");
  return registration;
}

@PostConstruct
public void started() {
  //
}

}

我的测试班

**package com.mycmp.prj.pkg3;**

import static org.junit.Assert.assertNotNull;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.mongodb.MongoClient;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyApplication.class)
public class MongoConfigStoreTest {

  @Test
  public void testConnection() throws Exception {

    final MongoClient client = new MongoClient("localhost", 127027);
    assertNotNull(client);
    assertNotNull(client.getDatabase("localhost"));

  }
}

答案 3 :(得分:0)

我必须将hamcrest-all-1.3.jar添加到类路径中才能运行单元测试。

junit 4.12

java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=myTest], {ExactMatcher:fDisplayName=scannerTest(example.JavaTest)], {LeadingIdentifierMatcher:fClassName=example.JavaTest,fLeadingIdentifier=myTest]] from org.junit.internal.requests.ClassRequest@38af3868
    at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40)

答案 4 :(得分:0)

检查以下条件:

  1. 您是否使用过org.junit.jupiter.api.Test;而不是org.junit.Test; 运行Junit 4测试用例?
  2. 您是否已将参数传递给 测试方法如下所示:

public void test(String arg){ assertTrue(true); }

  1. 重新构建项目也可以:

    mvn全新安装

答案 5 :(得分:0)

我找到了以下对我有用的解决方案。

您的应用程序@SpringBootApplication程序包名称 和测试包名称应该相同。

查看是否有帮助。 编码愉快。

答案 6 :(得分:0)

如果这是一个Maven项目,请以eclipse:eclipse作为Maven版本运行。这解决了我的问题。

答案 7 :(得分:0)

首先能够确保带有@test注释的方法以及测试类是公开的。