在Eclipse中运行Spring Boot应用程序时会选择测试类。

10

我正在使用STS和Gradle插件开发Spring Boot应用程序。为了避免我们的Selenium测试需要登录,我有一个不同的配置。

因此,在src/test/java/etc中,我有类似以下内容的东西:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
public static class SecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {   
        http.authorizeRequests().anyRequest().permitAll();
    }
}

src/main/java中,我有一个相当的类来配置登录等,要求所有页面都需要登录。

如果我通过Gradle插件(bootRun)运行应用程序,一切正常。

然而,如果我直接通过Eclipse运行或调试它(例如右键单击项目,选择Run As->Spring Boot App或通过Spring或Java视图中的运行/调试按钮单击),那么测试配置会被应用,因此可以在没有登录的情况下访问所有页面。

我猜想在以这种方式启动应用程序时,测试类被包含在类路径中。有没有简单的方法可以防止这种情况发生?


3
我能想象你可以通过在这个类上添加 @Profile("test") 以及在测试中添加 @ActiveProfiles("test") 来解决这个问题。这将使得该 bean 只在该配置文件下被激活。请参考 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#testcontext-ctx-management-env-profiles。 - zapl
看起来是一个不错的潜在解决方案,虽然即使我将@profile("test")添加到测试配置类中,当我运行应用程序时它仍然被使用。我稍后会进一步调查这个问题 - 谢谢。 - Martin Wilson
2
我可以确认的是,问题几乎肯定是运行时类路径中包含了“test”内容。虽然我不认为有相关的问题票据,但这是一个已知的问题。这是由于Gradle的工具模型没有区分“测试”和“运行时”类路径所导致的问题。恐怕避免这个问题最简单的方法是切换到使用Maven。我知道m2e/maven可以正确处理这个问题。 - Kris
谢谢 @Kris - 目前我已经通过取消测试的独立配置来解决了这个问题。 - Martin Wilson
我在我的build.gradle文件中编写了一些代码,使用运行时类路径生成Eclipse启动配置。我使用此启动配置来运行我的本地应用程序服务器。请参见http://stackoverflow.com/a/40646309/1423583。 - Nathan
1
我使用Maven,遇到了同样的问题。 - KSobkowiak
3个回答

2
当您在Eclipse中运行测试时,类路径由Eclipse准备(而不是由Maven或Gradle准备)。
Eclipse仅使用每个项目的一个类路径,并且不知道任何依赖范围(如“编译”或“测试”)的内容。 因此,类路径始终包含任何引用项目的资源。
您无法更改Eclipse的这种行为。 您需要使用命名约定、配置文件等来避免意外使用测试资源。

1

至少Eclipse IDE版本:2022-12(4.26.0)具有一项功能,允许从Debug/Run配置类路径中排除测试代码:

进入您用于运行应用程序的Run/Debug配置,选择Dependencies选项卡,勾选“排除测试代码”复选框。


0

您可以将@TestComponent附加到测试配置类上。这些bean配置将在应用程序的组件扫描期间被跳过。根据组件扫描配置,您需要定义一个@ComponentScan排除过滤器:excludeFilters = @ComponentScan.Filter(value = TestComponent.class, type = FilterType.ANNOTATION))


它能够工作,但是这种方法有一个问题:你必须在生产环境中添加Spring测试类,否则你会得到ClassNotFoundException。 - Wellington Souza
@WellingtonSouza 这是真的。或者你也可以使用正则表达式来排除测试类,例如 excludeFilters = @ComponentScan.Filter(pattern = ".*TestConfiguration", type = FilterType.REGEX) - StefanR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接