当前位置: 首页 > 知识库问答 >
问题:

使用测试应用程序。Spring Boot中支持CamelSpringTestSupport的属性文件

白云
2023-03-14

先决条件

  • Apache Tomcat 7
  • Spring 4.1.5。发布
  • Spring靴1.2.2。发布
  • Apache Camel 2.15.1

问题

我将Spring Boot与Endpoint Setup也使用的配置类一起使用。

@SpringBootApplication
@Import({MyConfiguration.class, EndpointSetup.class})
public class MyFatJarRouter extends FatJarRouter { ... }


@Configuration
@ConfigurationProperties(prefix = "camel.route", ignoreUnknownFields = false)
public class MyConfiguration {
    private List<String> brokerUrl = new ArrayList<>();
    public List<String> getBrokerUrl() {return brokerUrl;}
    public void setBrokerUrl(List<String> brokerUrl) {this.brokerUrl = brokerUrl;}

}

在生产环境中,默认情况下,属性将从conf/application.properties读取。

我想通过CamelSpringTestSupport测试我的路线

因此,我尝试了以下几点:

我已将application.properties置于测试/资源/配置/application.properties(-

然后写道:

public class MyJmsTest extends CamelSpringTestSupport {

    @Override
    protected AbstractApplicationContext createApplicationContext() {
        return new AnnotationConfigApplicationContext(MyFatJarRouter.class);
    }

    @Test
    public void myTest() throws Exception {
        ...
    }
}

在上面的示例中,配置没有从放置在测试文件夹中的application.properties中读取。

如何在CamelSpringTestSupport Unit-Test中读取特定于测试的配置文件?

共有3个答案

关苗宣
2023-03-14

我在这里找到了很多注释,解决了这个问题,现在正确地注入了测试属性:

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@ActiveProfiles("test")
@EnableAutoConfiguration
@ComponentScan
@ContextConfiguration()
public class MessageDeliveryTest{
}

此外,测试属性文件需要命名为application-{env}。属性,其中“env”是此处使用的配置文件。例如,对于测试,属性文件应该是应用程序测试。属性

蒋岳
2023-03-14

我通过使用以下标准Spring单元测试解决了这个问题:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @ActiveProfiles("test") // Load applicaton-test.properties in test/resources/config/application-test.properties
    @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) // cleanup spring context because jms broker does not exit properly
    public class MyJmsTest {

            private static final String MOCK_MY_ENDPOINT = "mock:myEndpoint";

            @Autowired
            CamelContext context;

            @Autowired
            ApplicationContext applicationContext;

            @Autowired
            ProducerTemplate producerTemplate;



           @Before
           public void configureMocks() throws Exception {
              context.getRouteDefinition("MyRoute")
             .adviceWith(context, new AdviceWithRouteBuilder() {
                @Override
                public void configure() throws Exception {
                    weaveByToString(".*myEndPointId.*")
                            .replace()
                            .to(MOCK_MY_ENDPOINT);
                }
              });

           final MockEndpoint endpoint = context.getEndpoint(MOCK_MY_ENDPOINT, MockEndpoint.class);
           endpoint.whenAnyExchangeReceived(new Processor() {
               @Override
               public void process(Exchange exchange) throws Exception {

                   InputStream inStream = getClass().getClassLoader().getResourceAsStream("xml/my.xml");
                   String in = context.getTypeConverter().convertTo(String.class, inStream);
                   exchange.getIn().setBody(in);
               }
            });
          }




            @Test
            public void synchronousCallBasic_1() throws Exception {
                    final MyConfiguration MyConfiguration = applicationContext.getBean(MyConfiguration.class);
                    final String myMessageBody =
                            context.getTypeConverter().convertTo(String.class, getClass().getClassLoader()
                                    .getResourceAsStream("xml/0010_example.xml"));

                    final Object myResult = producerTemplate.requestBody(MyConfiguration.getActiveMqSynchronousEndpointUri(), myMessageBody);

                    assertThat(myResult, notNullValue());
                    assertThat((String)myResult, is("<example>1</example>"));
            }
    }
云丰
2023-03-14

我可能回答得有点晚,但有一个比破解endpoint更好的方法。以下解决方案使用Camel 2.16中引入的toD。我编写了一个自定义组件“github”(也有一个官方的),以下是我测试它的方式。请注意,我没有使用单个Camel专有注释。要注入属性,我可以使用@SpringBootTest中的属性属性,或者Spring Boot中可用的任何其他标准技术。

注意,我使用的是$simple{…} 以避免与Spring特性分辨率冲突。

<代码>

是的,骆驼文档很糟糕!他们写得像发行说明一样,每个版本都有一个专门的部分,似乎没有更新文档以跟上最新版本(以下技术没有文档记录)。想象一下,去一家餐馆,要求提供特价,却被服务员告知前一天和前一周的特价,等等。改为对文档进行版本控制怎么样?

<代码>

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD)
public class GitHubRouteTest {
    @Autowired
    private CamelContext camelContext;

    @Autowired
    private ProducerTemplate template;

    @Autowired
    private GitHubClient gitHubClient;

    @Test
    public void testGitHubClientInvoked() throws InterruptedException {
        template.sendBodyAndHeader("direct:start", "whatever",
                "endpoint", "commits/test/test?username=test&password=test");

        verify(gitHubClient).getCommitsForARepo(eq("test"), eq("master"), eq("test"), eq(20));
    }

    @SpringBootApplication
    public static class TestApplication {
        public static void main(String[] args) {
            new SpringApplicationBuilder()
                    .sources(TestApplication.class)
                    .web(false)
                    .run(args);
        }

        @Bean
        public RouteBuilder testRoute() {
            return new RouteBuilder() {
                @Override
                public void configure() throws Exception {
                    from("direct:start")
                            .toD("github:$simple{in.header.endpoint}");
                }
            };
        }

        @Bean
        public GitHubClient mockGitHubClient() {
            GitHubClient mock = Mockito.mock(GitHubClient.class);

            return mock;
        }
    }
}

 类似资料:
  • 我在src/main/resources下创建了2个文件: 应用程序。属性 第一个具有从env变量中获取值的属性,而后者具有固定值。 根据这里的具体情况,我以这样的方式推出了Spring靴: 然而,不会产生任何影响,并且应用程序是局部的。属性似乎被忽略。 有什么提示吗?

  • 问题内容: 我有需要在各种不同的登台环境中运行的JUnit测试。每个环境都有不同的登录凭据或该环境特定的其他方面。我的计划是将环境变量传递到VM中以指示要使用的环境。然后使用该var从属性文件中读取。 JUnit是否有任何内置功能来读取.properties文件? 问题答案: Java内置了读取.properties文件的功能,而JUnit内置了在执行测试套件之前运行安装代码的功能。 java阅读

  • 使用spring-boot时,一切工作都很好。尽管如此,在spring-boot中已删除了注释和。我试图将代码重构为新版本,但我做不到。对于以下测试,我的应用程序在测试之前没有启动,http://localhost:8080返回404: 如何重构测试以使其在Spring-Boot1.5中工作?

  • 集成测试: 当我偶尔运行这个测试时,一切都很好,但是当我和其他测试一起运行它时,没有使用模拟的ServerThroughRabbitMQ,所以一些spring缓存强制使用旧的rabbit侦听器。 我试图调试它,我可以看到,正确的bean被autowired到测试中,但由于某些原因旧监听器使用(旧bean字段instanceID=1新mocked bean instanceID=3),测试失败(不确

  • 我有一个带有源代码和测试层次结构的Spring Boot应用程序。在这两个层次结构中,我都有带有属性的application.yml文件。 假设我在src application.yml中有以下内容: 在application.yml的测试中,我得到了以下内容: 我希望我的所有测试都知道test application.yml中重写的值,如果test application.yml中没有值,则将从

  • 我正在将一个非常基本的web应用程序部署到Google应用程序引擎。我使用的是Springboot,我可以在本地很好地运行应用程序,但当我部署到Google时,应用程序引擎不会启动实例。我在启动时配置了一个云SQL数据源。 我有云sql配置属性配置src/main/Resources/application.properties.App Engine似乎找不到这些属性,所以它无法正确设置Cloud