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

TestNG测试未使用TestPropertySource注入@Value

方绪
2023-03-14

我正在尝试为一个类编写测试,该类具有从属性文件注入的字段值。我试图在运行TestNG测试时利用TestPropertySource注释获取其中的值,但它似乎忽略了我的属性文件。

有几十个类似的问题,我试着仔细阅读,并尽可能尝试它们的实现。但我的问题似乎略有不同,原因如下:

>

  • @TestProperty tSource和@Property tySource不适用于JUnit:谈论JUnit而不是TestNG(可能相关,也可能不相关?)它还讨论了将属性值注入测试类(与被测试的单元相反)上的字段。

    “@TestPropertySource不工作?”:讨论如何忽略丢失的属性,而不是如何修复它。

    "@TestProperty tySource未加载属性":还讨论了将值注入到测试类字段中(尝试了@RunFor@SpringBootTest,但也没有帮助)。

    谷歌搜索结果中的其他链接也没有帮助。

    你需要做什么才能让一个单元在测试中使用@Value注释字段设置属性?我是否可以请求spring为我提供类的实例,而不是自己创建它们?

    这里有一个小程序。

    福。JAVA

    package nl.jeroenheijmans.stackoverflow.testngprops;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Foo {
        @Value("${my.prop}")
        private String myProp;
    
        public String ExposeProp() {
            return myProp;
        }
    }
    

    足部的。JAVA

    package nl.jeroenheijmans.stackoverflow.testngprops;
    
    import org.springframework.test.context.TestPropertySource;
    import org.testng.Assert;
    import org.testng.annotations.Test;
    
    @TestPropertySource("classpath:application.properties")
    public class FooTest {
        @Test
        public void sanityCheck(){
            Foo foo = new Foo();
            Assert.assertNotNull(foo); // Success!
        }
    
        @Test
        public void testProperty() {
            Foo foo = new Foo();
            Assert.assertEquals(foo.ExposeProp(), "checkcheck"); // Fail!
        }
    }
    

    应用属性(在测试文件夹中)

    my.prop=checkcheck
    

    主要的JAVA

    package nl.jeroenheijmans.stackoverflow.testngprops;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    import org.springframework.context.annotation.PropertySource;
    
    @SpringBootApplication
    @PropertySource(value = {"classpath:application.properties"})
    public class Main extends SpringBootServletInitializer {
        public static void main(String... args) {
            SpringApplication.run(Main.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Main.class);
        }
    }
    

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>nl.jeroenheijmans.stackoverflow</groupId>
        <artifactId>testngprops</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${org.springframework.boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>org.testng</groupId>
                    <artifactId>testng</artifactId>
                    <version>${testng.version}</version>
                    <scope>test</scope>
                </dependency>
                <dependency>
                    <groupId>org.mockito</groupId>
                    <artifactId>mockito-all</artifactId>
                    <version>${mockito.version}</version>
                    <scope>test</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven.compiler.version}</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
        <properties>
            <java.version>1.8</java.version>
            <maven.compiler.version>3.5</maven.compiler.version>
            <org.springframework.boot.version>1.5.1.RELEASE</org.springframework.boot.version>
            <testng.version>6.9.10</testng.version>
            <mockito.version>1.9.5</mockito.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    </project>
    
  • 共有1个答案

    呼延运恒
    2023-03-14

    我是这样解决的。

    简而言之,我认为您缺少了扩展org的部分。springframework。测验上下文testng。AbstractTestNGSpringContextTests并通过@Autowire注释对对象Foo使用依赖项注入。由于您正在实例化Foo对象,因此没有向其中注入值,这就解释了断言失败的原因。

    主要的JAVA

    package com.rationaleemotions.stackoverflow.qn45716815;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
    import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    import org.springframework.context.annotation.PropertySource;
    
    @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
    @PropertySource(value = {"classpath:application.properties"})
    public class Main extends SpringBootServletInitializer {
        public static void main(String... args) {
            SpringApplication.run(Main.class, args);
        }
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Main.class);
        }
    }
    

    使用@SpringBootApplication(exclude={MongoAutoConfiguration.class,MongoDataAutoConfiguration.class})的原因可以在这个线程中找到:Mongo试图自动连接到端口27017(localhost)

    更新:排除Mongo配置是可选的,如果你有一个为Mongo正确设置的项目,你不需要这样做。

    下面是最脚的。java看起来像

    package com.rationaleemotions.stackoverflow.qn45716815;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.TestPropertySource;
    import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
    import org.testng.Assert;
    import org.testng.annotations.Test;
    
    @TestPropertySource("classpath:application.properties")
    @SpringBootTest
    public class FooTest extends AbstractTestNGSpringContextTests{
        @Autowired
        private Foo foo;
    
        @Test
        public void sanityCheck() {
            Assert.assertNotNull(foo);
        }
    
        @Test
        public void testProperty() {
            Assert.assertEquals(foo.ExposeProp(), "checkcheck");
        }
    }
    

    下面是我的maven依赖项的样子

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.5.6.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>1.5.6.RELEASE</version>
        <scope>test</scope>
    </dependency>
    

    在spring boot starter日志中添加排除的原因可以在这里找到:在spring boot中禁用Logback

    更新:排除logback是可选的,如果你有一个项目是正确设置的,可以使用logback。

    以下是我运行此测试时的输出:

    objc[36167]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/bin/java (0x1026784c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x1027404e0). One of the two will be used. Which one is undefined.
    log4j:WARN No appenders could be found for logger (org.springframework.test.context.BootstrapUtils).
    log4j:WARN Please initialize the log4j system properly.
    
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v1.5.6.RELEASE)
    
    
    ===============================================
    Default Suite
    Total tests run: 2, Failures: 0, Skips: 0
    ===============================================
    
     类似资料:
    • 我是配置硒的新手。寻找路过的司机找到此解决方案https://stackoverflow.com/a/35101914/7104440我想知道是否有可能以这种方式从浏览器中注入许多驱动程序。是否可以绑定不同的驱动程序?我收到错误代码: 1)不允许绑定到null实例。如果这是您的预期行为,请使用Providers.of(null))。在assecobs.driver.DriverModule.con

    • 我试图通过testng运行简单的Cucumber/Java测试。xml。 所以,我有testng。xml: 我用的是runner。类,在其中我将路径/选项/etc设置为功能文件、步骤和报告: 但是当我运行testng时。xml作为TestNG套件,它: 1) 通过我自己的设想, 但是 我做错了什么?

    • 我对SpringBeans的正确配置有问题。我的整个应用程序在Spring上运行正常,我想添加jUnit测试。不幸的是,豆子注射不当。我在同一个模块中有两个目录。我的整个应用程序都在里面: /src/main/java/main/ 这是正确的,我添加了restest。java和Beantest配置。java内部: /src/test/java/main/ 和配置BeanTestConfigurat

    • 似乎我在Spring 4.1.17中使用Spring Boot1.2.6.RELEASE做的任何事情都不起作用。我只想访问应用程序属性并在必要时使用test覆盖它们(无需使用hack手动注入Property tySource) 这不工作... 这也不是. 也不是这个... 完整的测试用例... 导致 似乎3.x和4.x之间有很多相互矛盾的信息,我找不到任何可以肯定的东西。 如有任何见解,将不胜感激

    • 问题内容: Spring在以下方面很好地支持JUnit:使用和注释,事情看起来非常直观 该测试将能够在Eclipse&Maven中正确运行。我想知道TestNG是否有类似的东西。我正在考虑迁移到“下一代”框架,但没有找到与Spring测试匹配的对象。 问题答案: 它也可以与TestNG一起使用。

    • Summary NoSQL databases provide looser consistency restrictions than traditional SQL databases. By requiring fewer relational constraints and consistency checks, NoSQL databases often offer performanc