【问题标题】:SpringBoot unit test configurationSpring Boot 单元测试配置
【发布时间】:2016-11-21 17:31:56
【问题描述】:

我创建了一个 spring-boot 1.4.0 应用程序,我想使用 yaml 文件对其进行国际化。

我创建了一个用于从 yaml 文件加载配置的类,就像这里 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties 的文档中解释的那样。

我想创建一个测试来检查我的类是否正确加载了 yaml 文件中的属性。

如果我们保留文档中的示例,如何创建一个单元测试来加载 yaml 文件(与 application.yml 不同的名称)并检查方法 getUsername() 是否将返回 yaml 文件中的值?


这是我的代码,但仍然无法加载用户名:

@Component
@ConfigurationProperties(locations = "classpath:mylocalizedprops.yml", prefix="connection")
public class ConnectionProperties {

    private String username;

    // ... getters and setters

}

和测试类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
public class InternationalizationTest {
    @Autowired
    private ConnectionProperties connectionProperties;

    public void propsShouldBeNotNull() {
        assertNotNull(connectionProperties);
    }

    public void userNameShouldBeCorrect() {
        assertEquals(connectionProperties.getUsername(), expectedUserName);
    }
}

我未能通过 userNameShouldBeCorrect 测试。文件 mylocalizedprops.yml 位于 Maven 结构化应用程序的 src/main/resources 文件夹中。

【问题讨论】:

  • 文件在/src/test/resources 还是src/main/resources 中?如果它在src/main/resources 中,则需要将其放入测试资源中,或者将主源集加载为测试源集的一部分。
  • 它在 src/main/resources 但我认为最好在 src/test/resources 中创建一个用于测试目的,我该怎么做?
  • 复制并粘贴文件。缺点是您现在必须复制所有内容。
  • 如果我想继续使用 src/main/resources 中的文件(实际上是这样,但不起作用)如何进行?
  • 假设您正在使用 gradle,您希望将 /src/main/resources 添加到您的“测试”源集中。将以下内容添加到您的 build.gradle:sourceSets { test { resources [${project.projectDir}/src/${sourceSet.name}/resources], [${project.projectDir}/src/main/resources] } }

标签: java spring unit-testing spring-boot


【解决方案1】:

我认为这是一个集成测试,而不是单元测试,因为您正在测试各种组件之间的交互。无论如何,这就是我的做法。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = YourApplication.class)
public class InternationalizationTests() {

  @Autowired
  ConnectionProperties connectionProperties;

  @Test
  public void testCorrectTranslationLoaded() {
    Assert.assertEquals("english-username", connectionProperties.getUsername());
  }    

}

如果您愿意,您还可以创建一个测试配置,您可以指定要加载的翻译。然后,您将需要不同的类来测试不同的配置。查看文档:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html

【讨论】:

  • 我用代码更新了我的帖子,我无法正确加载文件。
【解决方案2】:

使用 Jmockit 可以轻松完成单元测试

    import org.junit.jupiter.api.Test;
    import org.springframework.boot.SpringApplication;
    import org.springframework.context.ConfigurableApplicationContext;

    import mockit.Mock;
    import mockit.MockUp;
    import mockit.Mocked;
    import mockit.Verifications;

    class RuleApiApplicationTest {
        
        @Mocked
        private ConfigurableApplicationContext mockedContext;

        @Test
        void testApplicationRun() {
            new MockUp<SpringApplication>() {
                @Mock
                public ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
                    return mockedContext;
                }
            };

            RuleApiApplication.main(new String[]{});
            
            new Verifications() {{
                SpringApplication.run(RuleApiApplication.class, new String[]{});
            }};
        }
    }

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2016-03-29
    • 2016-05-28
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多