【发布时间】:2021-09-28 20:25:56
【问题描述】:
我有两个 Maven 项目 A 和 B,其中项目 B 嵌套在项目 A 中。结构如下所示:
Project A:
src/test/java:
MyTest.java
Project B:
src/test/java:
MyNewTest.java
pom.xml
pom.xml
我的目标是让 MyNewTest.java 充当 MyTest.java 的包装器,并能够从 MyNewTest.java 调用在 MyTest.java 中声明的测试方法。 MyTest 有一些注入的依赖项。
我的问题是:如何在 MyNewTest 中初始化 MyTest 以确保 MyTest 的所有依赖都被正确注入?
MyTest 如下所示:
public class MyTest {
@Autowired
Service service;
@Autowired
TestUtil util;
Info info;
@PostConstruct
void init() {
info = service.getStuff();
}
@Test
public test1() {
service.getMoreStuff();
// more code omitted
}
}
我尝试将@Component 添加到 MyTest,然后在 MyNewTest.java 中使用 @Autowired,如下所示:
public class MyNewTest {
@Autowired
private MyTest baseTest;
@Test
public void runTest() {
// run the test in MyTest.java
baseTest.test1();
}
}
但这似乎不起作用 - baseTest 为空。我还尝试通过调用其默认构造函数来初始化 MyTest,但未能按预期注入依赖项。谁能建议一种初始化 MyTest.java 的正确方法,以便也注入它的所有依赖项?谢谢
【问题讨论】:
-
在没有更多信息的情况下难以诊断。一个小问题,代码中的一个小错字 - 第一类是 MyTest 对吗?不是 MyNewTest。除了一个线索之外,如果一个自动装配的字段在启动后为空,那么包含该字段的实例不会包含在 Spring 应用程序上下文中,因为启动将失败,并出现与预期类型为 MyTest 的 bean 类似的错误。因此,要么 Spring 没有创建 MyNewTest 的实例(它的包是否在 ComponentScan 的范围内?),要么您引用了一个不在 applicationcontext 中的实例
-
你怎么知道它是空的? NullPointerException 还是调试?当您的测试开始时,您是否看到 Spring Boot 启动了?关于其他线索的一些想法
-
实际上,如果这些是需要在 Spring Boot 上下文中运行的测试类,我认为您需要将这些类注释为 SpringBootTest
-
@Chris 谢谢你,克里斯。是的,很抱歉第一堂课是 MyTest,我编辑过。我从调试和 NullPointerException 中都发现它为空。您能否详细说明 ComponentScan?我应该将 ComponentScan 添加到 MyNewTest 并指定 MyTest 的包吗?
-
你有几个问题,第一个测试类不是 spring bean,因此你不能自动连接它们,第二个测试类不是为项目创建的工件的一部分(所以它们不是不在那里)。同样通常创建这样的依赖测试通常是一个非常糟糕的主意。
标签: java spring spring-boot dependency-injection