@Value 在单元测试中返回 null [英] @Value returning null in unit test

查看:54
本文介绍了@Value 在单元测试中返回 null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有端点测试配置类的 spring 启动应用程序和一个单元测试来测试我的 http 客户端.我正在尝试从位于我的 src/test 中的 application.properties 中获取我的服务器地址和端口.(所有类都在我的 src/test 中.)

I have a spring boot app with an Endpoint Test Configuration class and a unit test to test my http client. I am trying to get my server address and port from my application.properties which is located in my src/test.(All the classes are in my src/test.)

这是我的配置类代码:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import javax.xml.bind.JAXBException;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import com.nulogix.billing.service.PredictionEngineService;
import com.nulogix.billing.ws.endpoint.AnalyzeEndPoint;
import com.nulogix.billing.ws.endpoint.GetVersionEndPoint;
@Configuration
public class EndPointTestConfiguration {




    @Value("${billing.engine.address}")    
    private String mockAddress;

    @Value("${billing.engine.port}")
    private String mockPort;

    @Bean
    public String getAddress() {
        String serverAddress = "http://" + mockAddress + ":" + mockPort;
        return serverAddress;

    }

    @Bean
    public GetVersionEndPoint getVersionEndPoint() {
        return new GetVersionEndPoint();
    }

我用@value 注释了我的 .properties 中的值,然后创建了一个我用 bean 实例化的方法,以返回我的服务器地址字符串.

I annotated the values from my .properties with @value and then created a method that I instantiated with a bean to to return my server address string.

然后我在我的 HttpClientTest 类中使用该字符串值:

I then use that string value here in my HttpClientTest class:

import static org.junit.Assert.*;

import java.io.IOException;
import java.util.Map;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.fluent.Request;
import org.apache.http.entity.ContentType;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ConfigurableApplicationContext;

import com.google.gson.Gson;
import com.nulogix.billing.configuration.EndPointTestConfiguration;
import com.nulogix.billing.mockserver.MockServerApp;

@SpringBootTest(classes = EndPointTestConfiguration.class)
public class HttpClientTest {


    @Autowired
    EndPointTestConfiguration endpoint;


    public static final String request_bad  = "ncs|56-2629193|1972-03-28|20190218|77067|6208|3209440|self|";
    public static final String request_good = "ncs|56-2629193|1972-03-28|20190218|77067|6208|3209440|self|-123|-123|-123|0.0|0.0|0.0|0.0|0.0|0.0|0.0";
    //gets application context
    static ConfigurableApplicationContext context;

    //call mock server before class

    @BeforeClass
    static public void  setup(){
        SpringApplication springApplication = new SpringApplicationBuilder()           
                .sources(MockServerApp.class)
                .build();
        context = springApplication.run();
    }
    //shutdown mock server after class

    @AfterClass
    static public void tearDown(){
        SpringApplication.exit(context);
        }



    @Test
    public void test_bad() throws ClientProtocolException, IOException {
        // missing parameter
        String result = Request.Post(endpoint.getAddress())
                .connectTimeout(2000)
                .socketTimeout(2000)
                .bodyString(request_bad, ContentType.TEXT_PLAIN)
                .execute().returnContent().asString();

        Map<?, ?> resultJsonObj = new Gson().fromJson(result, Map.class);

        // ensure the key exists
        assertEquals(resultJsonObj.containsKey("status"), true);
        assertEquals(resultJsonObj.containsKey("errorMessage"), true);

        // validate values
        Boolean status = (Boolean) resultJsonObj.get("status");
        assertEquals(status, false);
        String errorMessage = (String) resultJsonObj.get("errorMessage");
        assertEquals(errorMessage.contains("Payload has incorrect amount of parts"), true);

    }


    @Test
    public void test_good() throws ClientProtocolException, IOException {
        String result = Request.Post(endpoint.getAddress())
                .connectTimeout(2000)
                .socketTimeout(2000)
                .bodyString(request_good, ContentType.TEXT_PLAIN)
                .execute().returnContent().asString();

        Map<?, ?> resultJsonObj = new Gson().fromJson(result, Map.class);

        // ensure the key exists
        assertEquals(resultJsonObj.containsKey("status"), true);
        assertEquals(resultJsonObj.containsKey("errorMessage"), false);
        assertEquals(resultJsonObj.containsKey("HasCopay"), true);
        assertEquals(resultJsonObj.containsKey("CopayAmount"), true);
        assertEquals(resultJsonObj.containsKey("HasCoinsurance"), true);
        assertEquals(resultJsonObj.containsKey("CoinsuranceAmount"), true);
        assertEquals(resultJsonObj.containsKey("version"), true);

        // validate values
        Boolean status = (Boolean) resultJsonObj.get("status");
        assertEquals(status, true);
        String version = (String) resultJsonObj.get("version");
        assertEquals(version, "0.97");

    }

}

我在 request.post 中使用它,我不想在我的 IP 地址和端口号中进行硬编码.

I use it in the request.post, I didn't want to hardcode in my IP address and port number.

当我运行测试时它说

[ERROR]   HttpClientTest.test_bad:63 NullPointer
[ERROR]   HttpClientTest.test_good:86 NullPointer

但我不知道为什么它是空的?我很确定我已经实例化了所有内容,并且字符串已明确填充..

But I am not sure why it is null? I am pretty sure I have everything instantiated and the string is clearly populated..

我的配置包结构是 com.billing.mockserver,我的单元测试包结构是 com.billing.ws.endpoint.

My package structure for my config is com.billing.mockserver and my package structure for my unit test is com.billing.ws.endpoint.

这是我的 application.properties

Here is my application.properties

server.port=9119
server.ssl.enabled=false
logging.config=classpath:logback-spring.xml
logging.file=messages
logging.file.max-size=50MB
logging.level.com.nulogix=DEBUG
billing.engine.address=127.0.0.1
billing.engine.port=9119
billing.engine.api.version=0.97
billing.engine.core.name=Patient_Responsibility

推荐答案

您缺少对 springboot 的基本了解.@Configuration 类用于初始化其他 spring bean 和其他东西,并且是第一个初始化的类.你不应该 @Autowire @configuration 类.

You are missing springboot basic understanding. @Configuration class is to initialize other spring beans and other things and are the first classes which get initialized. You should not @Autowire @configuration class.

在您的配置类中,您可以为用户名和密码创建 Spring bean,并在您的测试类中自动装配它,或者直接在您的测试类中使用 @Value.

In your Configuration class you can either create Spring bean for username and password and autowire that in your test class or directly use @Value in your Test class.

示例:在您的配置类中,您正在创建 GetVersionEndPoint bean,您可以在 Test 类中autowire.

Example: in your configuration class you are creating bean of GetVersionEndPoint and you can autowire that in your Test class.

更新 2:

对于测试类,需要在src\test\resource

这篇关于@Value 在单元测试中返回 null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆