当前位置: 首页 > 知识库问答 >
问题:

@在单元测试中返回null值

诸腾
2023-03-14

我有一个spring boot应用程序,它有一个endpoint测试配置类和一个单元测试来测试我的http客户端。我正在尝试从应用程序中获取服务器地址和端口。位于我的src/测试中的属性。(所有类都在我的src/测试中。)

这是我的配置类代码:

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();
    }

我对我的中的值进行了注释。属性,然后创建一个方法,我用bean实例化该方法以返回我的服务器地址字符串。

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

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");

    }

}

我在请求中使用它。我不想硬编码我的IP地址和端口号。

当我运行测试时,它说

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

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

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

这是我的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

共有1个答案

关玄裳
2023-03-14

您缺少对springboot的基本理解<代码>@配置类用于初始化其他Springbean和其他东西,是第一个初始化的类。您不应该使用Autowire配置类。

在您的配置类中,您可以为测试类中的用户名和密码创建Springbean和autowire,也可以直接在测试类中使用值。

示例:在configuration类中,您正在创建GetVersionEndPoint的bean,并且您可以在测试类中自动连接该bean。

更新2:

对于测试类,您需要在src\test\Resources中添加application.properties文件

 类似资料:
  • 我使用textutils.join连接一个字符串列表,但它返回null。我是在一个简单的单元测试中这样做的。 下面是有问题的代码:

  • 我试图实现一个单元测试的在与。 我在关注这个链接,它运行良好,但结果为空,当我用浏览器测试我的websocket时,它会发送所需的结果。 让我展示一下我的测试课 } 这是我的< code > WebSocketConfiguration 类 } 这是我从服务器得到的响应 更新: 在下面的答案中添加建议的更改并经过进一步的研究后,我的测试类现在看起来像这样 } 经过这些更改后,我现在可以将堆栈跟踪打

  • 以下是presenter中调用的方法: 下面是我的测试方法: 在Super.UpdateViewModel(vm)的处理程序中,我调用“SharedPreferenceHandler.MinStance.AccessToken!!)” 在我的测试方法中有可能得到这一点吗?

  • 共享Api实现类,添加preauthorize-admin,查看所有用户 这是我的JUnit测试,我发送get请求并返回403错误。

  • 测试方法: 测试用例:

  • 我们正在测试Docusign在业务应用程序的审批流中的使用。我们使用OAuth解决方案进行服务集成,即JWT(JSONWeb令牌)流。 当我打电话给apiClient时。配置JWTAuthorizationFlow方法在IIS Localhost中托管的应用程序中,我获得OAuthToken并可以发送信封。 但是,当我在测试服务器上部署解决方案时,使用相同的userId、integratorKey