java - 通过集成测试执行生产代码时@Autowired 字段为 null

标签 java spring-boot spring-data-jpa grpc-java

过去几天我一直在挠头,有点奇怪。我有一个 JPA 存储库,它被现场注入(inject)到服务类中。当运行服务器并通过客户端发送请求时,它工作得很好,但是当通过集成测试执行代码时,字段注入(inject)类(CustomerRepository)始终为空。

我通过互联网尝试了各种建议,但没有找到与我类似的情况,任何帮助将不胜感激

服务等级

@GRpcService
public class CustomerService extends CustomerServiceGrpc.CustomerServiceImplBase {

    @Autowired
    private CustomerRepository repository;

    @Override
    public void createCustomer(CreateCustomerRequest request, StreamObserver<CreateCustomerResponse> responseObserver) {

        final CustomerDao convertedDao = ProtoToDaoConverter.convertCustomerRequestProtoToCustomerDao(request);

        repository.save(convertedDao);

        responseObserver.onNext(CreateCustomerResponse.newBuilder().setSuccess(true).build());
        responseObserver.onCompleted();
    }
}

集成测试

@ExtendWith(SpringExtension.class)
@SpringBootTest
public class CustomerServiceIT {

    @Rule
    private final GrpcCleanupRule grpcCleanup = new GrpcCleanupRule();

    @Test
    public void something() throws IOException {

        String serverName = InProcessServerBuilder.generateName();

        // Create a server, add service, start, and register for automatic graceful shutdown.
        grpcCleanup.register(InProcessServerBuilder
                .forName(serverName).directExecutor().addService(new CustomerService()).build().start());

        customerServiceGrpc.CustomerServiceBlockingStub blockingStub = CustomerServiceGrpc.newBlockingStub(
                // Create a client channel and register for automatic graceful shutdown.
                grpcCleanup.register(InProcessChannelBuilder.forName(serverName).directExecutor().build()));

        final CreateCustomerRequest request = CreateCustomerRequest.newBuilder().setFirstName("Simon").setSecondName("Brown").setRole("Product Developer").build();

        final CreateCustomerResponse response = blockingStub.createCustomer(request);
    }

}

最佳答案

在测试中您调用 new CustomerService() 。您自己创建一个对象,而不是通过 spring。我想你应该在测试类中创建一个字段

@Autowired private final CustomerService customerService

并传入 grpcCleanup.register(InProcessServerBuilder .forName(serverName).directExecutor().addService(customerService).build().start());

关于java - 通过集成测试执行生产代码时@Autowired 字段为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60186874/

相关文章:

java - 从 Eclipse 创建 Web 服务客户端

spring-boot - Spring Boot spring.factories 与 @Enable 注释

java - 在 Spring Boot 中添加 servlet 过滤器时没有默认构造函数

java - 有没有办法在不应用存储库基类的情况下使用存储库?

java - 自定义 Spring Data Rest @ManyToMany 关系处理

java - Spring MVC + Before Advice 检查安全性

java - 如何仅在正则表达式中的显式信号词之后匹配?

java - 调度程序、CrudRepository 和 TransactionRequiredException

java - 如何创建一个以泛型类作为类型的泛型类?

spring-boot - Spring Boot,从Gradle 5的测试中排除依赖项