首页 > 解决方案 > 在 Testng 测试中使用来自 Spring Cloud 配置服务器的数据不起作用

问题描述

我有一个基于 Spring Boot 的服务器,它通过本地运行的 Spring Cloud 配置服务器访问其配置。配置服务器通过@ConfigurationProperties 提供数据库配置(数据库服务器、名称、用户等),如下面的“ServiceConfigProvider”所示。当应用程序服务器正常运行时,这可以正常工作。

当我使用 Testng 创建 @Test 时,不会注入数据库属性。事实上,没有记录配置服务器曾经被访问过。如何在我的@Test 中启用对配置服务器的访问?

主应用服务器:

@SpringBootApplication
@RefreshScope
public class ApplicationServer implements CommandLineRunner {

public static void main(String [] args) {
  SpringApplication.run(ApplicationServer.class, args);
}

数据库属性类:

@Configuration
@ConfigurationProperties(prefix="db.product")
@Getter @Setter @ToString
public class DbProductServiceConfig {
    private String                          dataBaseProductType;
    private String                          dataBaseName;
    private String                          userName;
    private String                          userPassword;
    private String                          hostName;
    private String                          hostPort;
}

我的测试课:

import org.testng.annotations.Test;
@SpringBootTest( classes = ApplicationServer .class )
public class CreateKeysTest extends AbstractTest {
    @Autowired
    private KeyService                          keyService;

    @Test
    public void createKeysTest() {
        keyService.allKeys();
    }
}

public class AbstractTest extends AbstractTestNGSpringContextTests {
}

读取输入数据源的 DB 参数的类。这就是@Test 中发生故障的地方。userName 属性(和所有其他属性)为空。

@Component
public class ServiceConfigProvider {
    @Autowired
    private DbProductServiceConfig                  dbProductServiceConfig;
    
    public PersistenceConfiguration persistenceConfiguration() {
        String  m = "persistenceConfiguration";
        int     d = 0;
        
        Validate.notNull(dbProductServiceConfig, DbProductServiceConfig.class);
        
        final String what = DbProductServiceConfig.class.getSimpleName();
        log.debug(m, d, "Create %s from %s: %s", 
                PersistenceConfiguration.class.getSimpleName(), what, dbProductServiceConfig);
        
        String userName = dbProductServiceConfig.getUserName();
        String userPassword = dbProductServiceConfig.getUserPassword();
        String hostName = dbProductServiceConfig.getHostName();
        String hostPort = dbProductServiceConfig.getHostPort();
        String dataBaseName = PersistenceConfigurationReaderWriter.filterValue( dbProductServiceConfig.getDataBaseName() );
        String dbProductTypeStr = dbProductServiceConfig.getDataBaseProductType();
        ProductType productType = PersistenceConfiguration.toProductType(dbProductTypeStr);
        if (productType == null)
            productType = ProductType.SQLSERVER;
        
        Validate.notNull(userName, "UserName missing from " + what);
        Validate.notNull(userPassword, "UserPassword missing from " + what);
        Validate.notNull(dataBaseName, "DataBaseName missing from " + what);
        
        PersistenceConfiguration pc = new PersistenceConfiguration();
        pc.setDataBaseName(dataBaseName);
        pc.setUserName(userName);
        pc.setUserPassword(userPassword);
        pc.setHostName(hostName);
        pc.setHostPort(hostPort != null ? Integer.getInteger(hostPort) : null);
        pc.setProductType(productType);
        
        return pc;
    }
}

标签: javaspring-bootspring-boot-test

解决方案


推荐阅读