Spring 在单元测试中启动 @RestController @Autowired null
Spring Boot @RestController @Autowired null in Unit tests
我不明白为什么 @Autowiring 我的 @RestController class 返回 null。
我想在进行集成测试之前进行基本的单元测试,但它失败了。
实际上,@Autowired 中的任何内容在测试包中都显示为 null。
我有一个很简单的测试,我只想看看基本作品:
一个非常简单的例子:
@Component
public class SimpleComponent {
public int add(int a, int b){
return a + b;
}
}
测试:
class SimpleComponentTest {
@Autowired
private SimpleComponent component;
@Test
public void givenSimpleComponentShouldNotBeNull(){
assertNotNull(component);//How on earth does this fail?
}
}
这是来自控制器的代码class:
@RestController
public class EmployeeAccountApi {
@PostMapping("/register")
public String register(){
return "Registering!";
}
}
public class EmployeeAccountApiUnitTest {
@Autowired
private EmployeeAccountApi employeeAccountApi;
@Test
public void testAutowiring(){
assertNotNull(employeeAccountApi);//Fails, Can't understand why
}
}
这适用于 @Mock 注释:
但我不想嘲笑它,因为那是 class 我正在进行单元测试。
我想测试方法 returns 一个基本字符串。
问题是为什么它不起作用?
@ExtendWith(MockitoExtension.class)
public class EmployeeAccountApiUnitTest {
@Mock
private EmployeeAccountApi employeeAccountApi;
@Test
public void testAutowiring(){
assertNotNull(employeeAccountApi);//This works
}
}
即使我得到的 Employee Service 在之前的测试中显然有效并经过测试,但在此 class:
中也是 null
public class EmployeeAccountApiUnitTest {
@Autowired
private EmployeeAccountApi employeeAccountApi;
@Autowired
private EmployeeService service;
@Test
public void testAutowiring(){
//assertNotNull(employeeAccountApi);
assertNotNull(service);
}
}
为什么@Autowired 在测试中为空?
模拟工作正常
很多类似的问题,但是太具体了,没有提供任何基本信息
@Autowired 仅在您为应用程序启动应用程序上下文时才有效。用 @SpringBootTest
注释测试 class,它告诉测试启动整个 spring 应用程序上下文,它应该可以工作。
@SpringBootTest 必须在测试 class 上用于 Spring 以加载您的 ApplicationContext 并连接起来。没有这个,Spring 就无法注入。
您可以在测试中使用 @WebMvcTest class 以仅将测试集中在 Web 层上。
有一大堆注释可以让您将 ApplicationContext 分割成许多其他方式来测试应用程序的其他各个部分。
Spring的文档和教程真的非常好。你应该检查一下。
我不明白为什么 @Autowiring 我的 @RestController class 返回 null。 我想在进行集成测试之前进行基本的单元测试,但它失败了。 实际上,@Autowired 中的任何内容在测试包中都显示为 null。
我有一个很简单的测试,我只想看看基本作品:
一个非常简单的例子:
@Component
public class SimpleComponent {
public int add(int a, int b){
return a + b;
}
}
测试:
class SimpleComponentTest {
@Autowired
private SimpleComponent component;
@Test
public void givenSimpleComponentShouldNotBeNull(){
assertNotNull(component);//How on earth does this fail?
}
}
这是来自控制器的代码class:
@RestController
public class EmployeeAccountApi {
@PostMapping("/register")
public String register(){
return "Registering!";
}
}
public class EmployeeAccountApiUnitTest {
@Autowired
private EmployeeAccountApi employeeAccountApi;
@Test
public void testAutowiring(){
assertNotNull(employeeAccountApi);//Fails, Can't understand why
}
}
这适用于 @Mock 注释: 但我不想嘲笑它,因为那是 class 我正在进行单元测试。 我想测试方法 returns 一个基本字符串。 问题是为什么它不起作用?
@ExtendWith(MockitoExtension.class)
public class EmployeeAccountApiUnitTest {
@Mock
private EmployeeAccountApi employeeAccountApi;
@Test
public void testAutowiring(){
assertNotNull(employeeAccountApi);//This works
}
}
即使我得到的 Employee Service 在之前的测试中显然有效并经过测试,但在此 class:
中也是 nullpublic class EmployeeAccountApiUnitTest {
@Autowired
private EmployeeAccountApi employeeAccountApi;
@Autowired
private EmployeeService service;
@Test
public void testAutowiring(){
//assertNotNull(employeeAccountApi);
assertNotNull(service);
}
}
为什么@Autowired 在测试中为空? 模拟工作正常
很多类似的问题,但是太具体了,没有提供任何基本信息
@Autowired 仅在您为应用程序启动应用程序上下文时才有效。用 @SpringBootTest
注释测试 class,它告诉测试启动整个 spring 应用程序上下文,它应该可以工作。
@SpringBootTest 必须在测试 class 上用于 Spring 以加载您的 ApplicationContext 并连接起来。没有这个,Spring 就无法注入。
您可以在测试中使用 @WebMvcTest class 以仅将测试集中在 Web 层上。
有一大堆注释可以让您将 ApplicationContext 分割成许多其他方式来测试应用程序的其他各个部分。
Spring的文档和教程真的非常好。你应该检查一下。