【问题标题】:Dependency Injection failure during mvn install loading standalone runmvn install 加载独立运行期间依赖注入失败
【发布时间】:2023-03-09 14:10:02
【问题描述】:

我有一个使用 Spring MVC 创建的 RESTful 服务。我使用 spring-test mvcmock 创建了一个集成测试来测试我的 Rest 控制器。

当我使用 run as Junit 运行此测试时。它运行良好。 但是,当在mvn install 期间执行相同的测试时,使用surefire 插件。此测试抱怨抛出致命错误:

没有符合条件的 bean 类型 ...

当我检查以前的日志时,它说它加载了 0 依赖项。 这是日志:

DEBUG XmlBeanDefinitionReader - 从位置模式 [classpath*:service-test-context.xml] 加载 0 个 bean 定义

但是,我再次以 Junit 身份运行这个测试类,我可以看到“在同一日志行加载了 23 个 bean”。

问题:您能否提出建议,可能是什么问题?

注意: 这是多 maven 模块应用程序,并且没有注入另一个模块的依赖项。 当我以 Junit 身份运行此测试时,我遇到了同样的问题。然后我在 eclipse > build > project 中添加了依赖模块,问题在作为 JUnit 运行时得到了解决。现在在做mvn install时遇到这个问题。

【问题讨论】:

  • 你的 JUnit runner 类是否以 Test 结尾?你也试过 mvn clean install 吗?
  • 不,但它正在被调用。是否必须以 Test 结尾。你可以在你的surefire配置中包含任何表达式。我也尝试了 mvn clean install,但没有运气。

标签: maven junit dependency-injection integration-testing maven-surefire-plugin


【解决方案1】:

您的安全配置是否包含 includes 参数?

“指定应包含在测试中的测试(按模式)的元素列表。当未指定和未指定测试参数时,默认包含将是

<includes>
 <include>**/Test*.java</include>
 <include>**/*Test.java</include>
 <include>**/*TestCase.java</include>
</includes>

"

简单的解决方法是重命名您的测试运行程序,使其以 Test.java 结尾。那么

mvn test

会捡起来的。

更新

另一种选择是:

“测试: 指定此参数以按文件名运行单个测试,覆盖包含/排除参数。您在此处指定的每个模式都将用于创建格式为 **/${test}.java 的包含模式,因此您只需键入“-Dtest=MyTest”即可运行名为“foo/MyTest.java”的单个测试。以 ! 为前缀的测试模式将被排除在外。 此参数覆盖包含/排除参数和 TestNG suiteXmlFiles 参数。从 2.7.3 开始,您可以通过添加#myMethod 或#my*ethod 在测试中执行有限数量的方法。例如,“-Dtest=MyTest#myMethod”。 junit 4.x 和 testNg 支持此功能。

从 2.19 开始,一个参数(JUnit 4、JUnit 4.7+、TestNG)支持复杂的语法: "-Dtest=???Test, !Unstable*, pkg/**/Ci*leTest.java, Test#testOne+testTwo?????, #fast*+slowTest" "-Dtest=Basic*, !%regex[..Unstable.], !%regex[..MyTest.class#one.|two.] , %regex[#fast.|slow.*]"

参数化 JUnit 运行器使用括号中的索引来描述测试方法,因此非正则表达式方法模式将变为:#testMethod[]。如果使用 @Parameters(name="{index}: fib({0})={1}") 并选择索引,例如5 在模式中,非正则表达式方法模式将变为#testMethod[5:]。

Type: java.lang.String
Required: No
User Property: test

"

因此,如果您的测试运行程序被命名为 foo/MyVeryOwnRunner.java,您可以执行以下操作

mvn clean test -Dtest=MyVeryOwnRunner

【讨论】:

  • 我有一个以 Tests.java 结尾的备件,除非我重命名它并删除 s,否则它不会运行。跨度>
  • 问题与运行测试用例无关。它正在运行。但是,没有加载所需的依赖项。
  • 啊。您必须将 provided 添加到您的外部 jars。
  • 默认范围是编译provided 表示您已在目标系统上定义了它。由于这是一个模拟,您可能需要范围 test
  • 默认是编译,因为它是所有的超集,它也应该在测试执行期间提供依赖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2017-09-16
  • 1970-01-01
  • 2013-06-30
  • 2012-08-13
  • 2017-09-24
  • 1970-01-01
相关资源
最近更新 更多