当我尝试将配置类作为测试类的内部类移动时,为什么会出现此错误消息?

时间:2014-11-30 21:27:03

标签: java spring spring-mvc junit spring-test

我正在攻读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)

为什么呢?可能是什么问题呢?我该如何尝试解决这个问题?

2 个答案:

答案 0 :(得分:0)

我认为您的LoggingBeanPostProcessor方法需要@Bean注释,不确定这是否会解决问题

答案 1 :(得分:0)

这个练习说inner class很奇怪。那是一个错误。它的实际含义是nested static class

TestInfrastructureConfig课程中将static课程声明为RewardNetworkTests

文档here进一步说明了这一点。但是,他们仍然错误地使用术语内部类。 JLS特别将内部类描述为非static嵌套类。在阅读文档时,您应该强调static