【问题标题】:Why I obtain this error message when I try to move the configuration class as an inner class of the test class?当我尝试将配置类作为测试类的内部类移动时,为什么会收到此错误消息?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      在RewardNetworkTests 类中将您的TestInfrastructureConfig 类声明为static。

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

      【讨论】:

        猜你喜欢
        • 2021-10-18
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多