我正在攻读Spring Core认证,我在Spring中使用 JUnit 测试时遇到了以下问题。
所以我有以下名为TestInfrastructureConfig
的配置类:
@Configuration
@Import({
TestInfrastructureDevConfig.class,
TestInfrastructureProductionConfig.class,
RewardsConfig.class })
public class TestInfrastructureConfig {
public LoggingBeanPostProcessor loggingBean(){
return new LoggingBeanPostProcessor();
}
}
此课程配置测试环境 -
现在在练习中说:
在Spring中没有配置类或配置XML文件 如果指定,
@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)
为什么呢?可能是什么问题呢?我该如何尝试解决这个问题?
答案 0 :(得分:0)
我认为您的LoggingBeanPostProcessor
方法需要@Bean
注释,不确定这是否会解决问题
答案 1 :(得分:0)
这个练习说inner class很奇怪。那是一个错误。它的实际含义是nested static
class。
在TestInfrastructureConfig
课程中将static
课程声明为RewardNetworkTests
。
文档here进一步说明了这一点。但是,他们仍然错误地使用术语内部类。 JLS特别将内部类描述为非static
嵌套类。在阅读文档时,您应该强调static
。