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的文档和教程真的非常好。你应该检查一下。

Testing the Web Layer