【问题标题】:Autowired bean in spock test null after downgrading spring from 4.3.x to 3.2.x将 spring 从 4.3.x 降级到 3.2.x 后 spock 测试中的自动装配 bean
【发布时间】:2018-05-06 09:39:19
【问题描述】:

我将我的应用程序从 spring 4.x 降级到 3.x,现在当我在 spock 中使用自动装配 bean 进行简单测试时,这个 bean 为空。

@ContextConfiguration(classes = Configuration.class)
class SomeTestClass extends Specification {

    @Autowired
    SomeService someService

    def "someService"(){
         expect:
         someService.returnHelloWorld() == "Hello World" // (<- NullPointer)

    }
}

我的 pom.xml 文件:

<dependencies>
  <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.12</version>
        </dependency>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>1.1-groovy-2.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-spring</artifactId>
            <version>1.1-groovy-2.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.2.1.RELEASE</version>
            <scope>test</scope>
        </dependency>
</dependencies>

当我将 spock-core/spring 降级到 0.6-groovy-1.8 并将 groovy-all 降级到 1.8 并触发我的测试后,它会抛出这个异常:

org.springframework.beans.factory.BeanCreationException: 错误 创建文件中定义的名称为“someAnotherBean”的bean ../SomeBean.class:bean 的实例化失败;嵌套异常 isorg.springframework.beans.BeanInstantiationException:可以 notinstantiate bean 类 [..SomeBean.class]:无默认值 构造函数找到;嵌套异常是 java.lang.NoSuchMethodException:..SomeBean.()

这个 bean 包含我用来在类中初始化最终字段的构造函数:

@Component
@PropertySource("classpath:someproperties.properties")
public class HeaderFactory {

private final SomeObject someObject;

    public HeaderFactory(@Value("${someProperty1}") String someProperty1, @Value("${someProperty2}") String someProperty2) {
        SomeObject someObject = new SomeObject(someProperty1,someProperty2);
       this.someObject = someObject;
    }
}

在我降级春季版本之前,一切都运行良好。有什么想法吗?

【问题讨论】:

  • 我不认为 Spring 早在3.2.x 就支持自动构造函数注入,但我可能错了。您可以尝试在构造函数中添加 @Autowired 注释。
  • 也许你知道这个的任何替代方案?
  • 在下面查看我的答案。
  • Spock-1.1 与 Spring 3 存在错误,请尝试 spock-1.2 快照,或稳定的 jitpack.io 构建,详情请参阅github.com/spockframework/spock 的自述文件。

标签: java spring groovy spock spring-test


【解决方案1】:

您可以创建一个配置类并在那里定义有问题的 bean:

@Configuration
class MyConfig {

    @Value("${someProperty1}") String prop1;
    @Value("${someProperty2}") String prop2

    @Bean
    public SomeBean someBean() {
        SomeBean bean = new SomeBean(prop1, prop2);
        return bean;
    }
}

此处的文档:https://docs.spring.io/spring/docs/3.2.0.RELEASE/spring-framework-reference/html/new-in-3.0.html#new-feature-java-config

【讨论】:

  • 不幸的是,以上方式不起作用。应用程序仍然抛出关于缺少默认构造函数的异常。还尝试在我的 Component 类中注入属性(通过字段),但它们是 null :(。还有什么想法吗?顺便说一句。我应该在我的 Configuration 类中使用 PropertySource 注释吗?
  • @KamilDS 您可以发布引发异常的类的代码吗? (SomeBean 类)。我在你的问题中没有看到。
【解决方案2】:

我通过这种方式解决了我的问题:

@Component
public class UrlBuilder {

    private final String host;
    private final String port;
    private final String protocol;

    @Autowired
    public UrlBuilder(Environment env) {
        this.protocol = env.getRequiredProperty("app.server.protocol").toLowercase();
        this.serverHost = env.getRequiredProperty("app.server.host");
        this.serverPort = env.getRequiredProperty("app.server.port", Integer.class);
    }
}

Source

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多