首页 > 解决方案 > 测试时无法从 yml 文件中读取值

问题描述

这是我的主类,当我创建一个模拟类来测试 start() 函数时,我在 ClientSecretBasic 行出现错误,它说“值不能为空或空字符串”,当我将值更改为常量时,它有效,这意味着我没有从 yml 文件中获取值,如何解决这个问题?

@Component
public class GrpcAuthorizationInterceptor
 @Value("${configuration.clientId}")
    private String clientId;
    @Value("${configuration.clientSecret}")
    private String clientSecret;

@Override
            public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
                final MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, final Channel next) {
                return new ForwardingClientCall.SimpleForwardingClientCall<>(next.newCall(method, callOptions)) {
                    @Override
                    public void start(Listener<RespT> responseListener, Metadata headers) {
                        ClientSecretBasic clientSecretBasic =  new ClientSecretBasic(new ClientID(clientId), new Secret(clientSecret)); //java.lang.IllegalArgumentException: The value must not be null or empty string

                        ***
                    }
                };
            }
}

这是我的 yml 文件。

configuration:
    clientId: "1234"
    clientSecret: "1234"

这就是我测试它的方式

Metadata headers = new Metadata();
        ClientCall.Listener listener = mock(ClientCall.Listener.class);
        clientCall.start(listener, headers);

标签: java

解决方案


可以像下面这样注入 Spring 值

@RunWith(MockitoJUnitRunner.class)
public class SomeTest {
  ClientInterceptor interceptor = (ClientInterceptor) new GrpcAuthorizationInterceptor(); 
 
  @Before
  public void setup() {
       // inject spring property values
       ReflectionTestUtils.setField(interceptor, "clientId", "some-value");
       ReflectionTestUtils.setField(interceptor, "clientSecret", "some-value");

  }
.....
-- test methods
}

推荐阅读