【发布时间】:2014-11-30 21:27:03
【问题描述】:
我正在为 Spring Core 认证而学习,并且在与 Spring 中使用 JUnit 测试相关的练习中遇到以下问题。
所以我有以下名为TestInfrastructureConfig 的配置类:
@Configuration
@Import({
TestInfrastructureDevConfig.class,
TestInfrastructureProductionConfig.class,
RewardsConfig.class })
public class TestInfrastructureConfig {
public LoggingBeanPostProcessor loggingBean(){
return new LoggingBeanPostProcessor();
}
}
这个类配置测试环境-
现在在一个练习中说:
在 Spring 中,当没有配置类或 configurationXML 文件时 指定,
@ContextConfiguration将查找标记的内部类 与@Configuration(如果没有找到它也会寻找一个XML<Classname>-context.xml 的文件名)。由于TestInfrastructureConfig反正班级这么小,复制整个 包含注释的类定义到具有 测试班。然后从@ContextConfiguration注释(括号中没有属性)。这个 是约定优于配置的一个例子。
所以我已经完全注释了TestInfrastructureConfig 类的代码,变成:
//package rewards;
//
//import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Import;
//
//import config.RewardsConfig;
//
//@Configuration
//@Import({
// TestInfrastructureDevConfig.class,
// TestInfrastructureProductionConfig.class,
// RewardsConfig.class })
//public class TestInfrastructureConfig {
//
// public LoggingBeanPostProcessor loggingBean(){
// return new LoggingBeanPostProcessor();
// }
//}
然后在RewardNetworkTests我改:
@ContextConfiguration(classes=TestInfrastructureConfig.class)
进入:
@ContextConfiguration()
我将注释TestInfrastructureConfig 的代码作为内部类添加到RewardNetworkTests 类中,如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes=TestInfrastructureConfig.class)
@ContextConfiguration()
//@ActiveProfiles("jdbc")
//@ActiveProfiles({ "jdbc", "jdbc-dev" })
@ActiveProfiles({ "jdbc", "jdbc-production" })
public class RewardNetworkTests {
/**
* The object being tested.
*/
@Autowired
private RewardNetwork rewardNetwork;
@Test
public void testRewardForDining() {
// create a new dining of 100.00 charged to credit card
// '1234123412341234' by merchant '123457890' as test input
Dining dining = Dining.createDining("100.00", "1234123412341234",
"1234567890");
// call the 'rewardNetwork' to test its rewardAccountFor(Dining) method
RewardConfirmation confirmation = rewardNetwork
.rewardAccountFor(dining);
// assert the expected reward confirmation results
assertNotNull(confirmation);
assertNotNull(confirmation.getConfirmationNumber());
// assert an account contribution was made
AccountContribution contribution = confirmation
.getAccountContribution();
assertNotNull(contribution);
// the contribution account number should be '123456789'
assertEquals("123456789", contribution.getAccountNumber());
// the total contribution amount should be 8.00 (8% of 100.00)
assertEquals(MonetaryAmount.valueOf("8.00"), contribution.getAmount());
// the total contribution amount should have been split into 2
// distributions
assertEquals(2, contribution.getDistributions().size());
// each distribution should be 4.00 (as both have a 50% allocation)
assertEquals(MonetaryAmount.valueOf("4.00"), contribution
.getDistribution("Annabelle").getAmount());
assertEquals(MonetaryAmount.valueOf("4.00"), contribution
.getDistribution("Corgan").getAmount());
}
@Configuration
@Import({
TestInfrastructureDevConfig.class,
TestInfrastructureProductionConfig.class,
RewardsConfig.class })
public class TestInfrastructureConfig {
public LoggingBeanPostProcessor loggingBean(){
return new LoggingBeanPostProcessor();
}
}
}
但是当我尝试运行测试时,我得到了红色条,测试没有通过,并且出现以下错误信息:
java.lang.IllegalStateException: Neither GenericXmlContextLoader nor AnnotationConfigContextLoader was able to detect defaults, and no ApplicationContextInitializers were declared for context configuration [ContextConfigurationAttributes@52d455b8 declaringClass = 'rewards.RewardNetworkTests', locations = '{}', classes = '{}', inheritLocations = true, initializers = '{}', inheritInitializers = true, name = [null], contextLoaderClass = 'org.springframework.test.context.ContextLoader']
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.processContextConfiguration(AbstractDelegatingSmartContextLoader.java:200)
at org.springframework.test.context.ContextLoaderUtils.buildMergedContextConfiguration(ContextLoaderUtils.java:703)
at org.springframework.test.context.ContextLoaderUtils.buildMergedContextConfiguration(ContextLoaderUtils.java:656)
at org.springframework.test.context.DefaultTestContext.<init>(DefaultTestContext.java:93)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:122)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:118)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:107)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
为什么?可能是什么问题呢?我该如何解决这个问题?
【问题讨论】:
标签: java spring spring-mvc junit spring-test