繁体   English   中英

仅运行测试时,Bean自动装配失败

[英]Bean autowire fail when running tests only

希望有人可能对此问题有答案。 运行测试时出现自动接线问题,其他情况则没有。 异常很清楚,因为它说缺少“ myField”。 但是,该字段是从基类继承的。 我在任何地方都找不到解决问题的答案,因此我将在这里尝试好运。

例外

org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'myService': Injection of autowired dependencies failed; 
    nested exception is java.lang.NoSuchFieldError: myField

我的基础班

public abstract class CommonStuff {
    protected String myField; // the one thats gone missing
    public abstract void setMyField(String myField);
}

我的服务

@Service("myService")
public class MyService extends CommonStuff {
    @Value("${myProperty.myField}")
    public void setMyField(String myField) {
        this.myField = myField;
    }
    ...
}

我的控制器

@Controller
public class MyController {
    @Autowired
    private MyService myService;        
    public void setMyService(MyService myService) {
        this.myService = myService;
    }
    ...
}

我的application-context.xml

似乎没有什么遗漏。

<context:component-scan base-package="com.myapp" />
<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:my.properties</value>              
            <value>classpath:myother.properties</value>
        </list>
    </property>
</bean>

my.properties

myProperty.myField=some value

我的测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:application-context.xml" })
public class MyControllerTest {
    @Autowired
    MyController myController;

    @Mock
    MyService myService;

    @Test
    public void myServiceTest() {
        // do stuff with myService
    }
    ...
}

问题

正如我提到的那样,代码运行正常,但是每当我尝试运行测试时,弹簧都无法自动装配。

问题不是测试,而是开始测试时的接线。 spring某种程度上无法从抽象的CommonStuff类中找到myField,因此它说MyService没有该字段。

如果需要,我可以发布完整的stacktrace,但是我认为异常的实质已经在这里。

我放弃了并将myField移回到服务中,并跳过了setMyField。 现在就是这样。

基类

public abstract class CommonStuff {    
    public abstract String getMyField();
    public void doCommonStuff() {
        // use getMyField() 
    }
}

我的服务

@Service("myService")
public class MyService extends CommonStuff {
    @Value("${myProperty.myField}")
    private String myField;

    @Override
    public String getMyField() {
        return myField;
    }
    ...
}

这解决了我想要的问题,因为我现在可以从CommonStuff访问myField。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM