[英]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;
}
...
}
似乎没有什么遗漏。
<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>
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.