I have an abstract Spring configuration class that includes a common bean:
public abstract class AbstractConfig {
@Bean
public CommonBean commonBean {
CommonBean commonBean = new CommonBean();
commonBean.specifics = getSpecifics();
};
public abstract String getSpecifics();
}
The common bean's specifics are set by its subclasses:
package realPackage;
@Configuration
public class RealConfig extends AbstractConfig {
@Override
public String getSpecifics() {
return "real";
}
}
...and...
package testPackage;
@Configuration
@ComponentScan(basePackages = {"testPackage", "realPackage" })
public class TestConfig extends AbstractConfig {
@Override
public String getSpecifics() {
return "test";
}
}
My test only needs to use the TestConfig
and shouldn't know about the RealConfig
(but does need access to other components in realPackage
). It begins:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class)
public class MyIntegrationTestIT { //... }
With the code above, this works as expected and uses the "test"
specifics. But if I reverse the order of packages in the @ComponentScan
, the "real"
specifics are used instead. This is baffling me - am specifying the TestConfig
so surely it should be calling the overridden method on this? Could anyone advise as to the reasons Spring does this and how it might be resolved?