标签: spring-boot-test

@JdbcTest 检测注释为 @SpringBootApplication 的类

我已经尝试过@JdbcTest以下项目结构。

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pom.xml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 java\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 com\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 example\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Application.java\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 repository\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 DemoRepository.java\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 service\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0             \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 DemoService.java\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 resources\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 application.properties\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 java\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 com\n                \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 example\n                    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ApplicationTests.java\n                    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 repository\n                        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 DemoRepositoryTests.java\n
Run Code Online (Sandbox Code Playgroud)\n\n

DemoRepository.java(测试目标)

\n\n
package com.example.repository;\n\nimport org.springframework.jdbc.core.JdbcOperations;\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic class DemoRepository {\n\n    private final JdbcOperations jdbcOperations;\n\n    DemoRepository(JdbcOperations jdbcOperations) {\n        this.jdbcOperations = …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-boot-test

5
推荐指数
1
解决办法
6750
查看次数

Spring boot @SpyBean 导致测试套件出错,可能是由于上下文未重置的问题

我对 Spring 集成测试有疑问。

行为:

  • 当我单独运行下面的测试时,它是成功的。

  • 然而,当运行所有测试时,其中许多测试(包括下面的测试)都会出错。

  • 当我忽略下面的测试并运行所有测试时,所有测试都成功。

我没有包含错误堆栈跟踪,因为它与我们的业务逻辑高度相关,并且我怀疑该错误与我对 spring boot test 的使用有关@SpyBean

这是测试:

@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = "test")
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

...

@Autowired
private TestRestTemplate restTemplate;

@Autowired
private DataKeyStore dataKeyStore;

@SpyBean
private TokenTools tokenTools;

...

@Test
public void myTest() throws Exception {

   doReturn("someGeneratedToken")
        .doReturn("someGeneratedToken")
        .doCallRealMethod()
        .when(tokenTools)
        .createToken(any(TokenProfile.class), anyString(), anyString());
  ...
Run Code Online (Sandbox Code Playgroud)

请注意,这DataKeyStore是 的依赖项TokenTools

正如我上面所说,我怀疑测试正在互相踩踏,并且我@SpyBean以某种方式泄漏了其他测试类......

我的问题是如何确保该测试不会影响其他测试?我尝试了@DirtiesContext注释,但没有效果...

另外令我困惑的是它@SpyBean已经重置(根据文档/javadoc)。

有人可以帮忙吗?

编辑:使用我的 IDE 调试测试表明,TokenTools所有测试仅实例化两次:一次是在测试初始化​​时,第二次是@SpyBean为上面的测试创建 。在上面的测试之后运行的其余测试使用第二个实例,即实例@SpyBean......

spring dependency-injection spring-test spring-boot spring-boot-test

5
推荐指数
2
解决办法
4598
查看次数

如何在@DataJpaTest中使用用户定义的数据库代理

我们需要跟踪数据库指标,因此我们使用 datasource-proxy 来跟踪它,以将其集成到我们创建的自定义数据源的 Spring Boot 项目中,如下所示

@Component
@Slf4j
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceBeanConfig
{

    public DataSource actualDataSource()
    {
        EmbeddedDatabaseBuilder databaseBuilder = new EmbeddedDatabaseBuilder();
        return databaseBuilder.setType(EmbeddedDatabaseType.H2).build();
    }

    @Bean
    @Primary
    public DataSource dataSource() {
        // use pretty formatted query with multiline enabled
        PrettyQueryEntryCreator creator = new PrettyQueryEntryCreator();
        creator.setMultiline(true);

        log.info("Inside Proxy Creation");

        SystemOutQueryLoggingListener listener = new SystemOutQueryLoggingListener();
        listener.setQueryLogEntryCreator(creator);

        return ProxyDataSourceBuilder
                .create(actualDataSource())
                .countQuery()
                .name("MyDS")
                .listener(listener)
                .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我们运行主应用程序时,数据源代理被拾取,但是当我们使用@DataJpaTest时,它没有被拾取。如何在 JUNIT 测试用例中启用数据源代理?

编辑::

使用SpringBeanPostProcessor配置Proxy DataSource

@Slf4j
@Configuration
public class DataSourceBeanConfig implements BeanPostProcessor …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-boot-test

5
推荐指数
1
解决办法
1165
查看次数

如何将 Testcontainers Cassandra 与 Spring Data for Apache Cassandra 一起使用?

我为与 Cassandra 一起使用的 Spring Boot 应用程序开发了集成测试。我CassandraTemplate用于与 Cassandra 通信。

我对数据库src/test/resources/application.properties有以下配置:

spring.data.cassandra.contact-points=cassandra-host
spring.data.cassandra.port=9042
Run Code Online (Sandbox Code Playgroud)

Testcontainers使用 Cassandra创建,我尝试了两种方法:

1) https://niels.nu/blog/2017/spring-cassandra-integration-tests.html

@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = {ExampleApplication.class})
@ContextConfiguration(initializers = CounterIntegrationTestContainers.Initializer.class)
@EnableConfigurationProperties
public class CounterIntegrationTestContainers extends CounterIntegrationTest {
    @ClassRule
    public static GenericContainer cassandra =
            new GenericContainer("cassandra:3")
                    .withExposedPorts(9042);

    public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
            EnvironmentTestUtils.addEnvironment(
                "testcontainers",
                configurableApplicationContext.getEnvironment(),
                "cassandra.host=" + cassandra.getContainerIpAddress(),
                "cassandra.port=" + cassandra.getMappedPort(9042)
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2) https://www.baeldung.com/spring-boot-testcontainers-integration-test - 在本例中我们可以看到 postgresql 容器,但我将其更改为 Cassandra:

public …
Run Code Online (Sandbox Code Playgroud)

cassandra spring-boot spring-data-cassandra spring-boot-test testcontainers

5
推荐指数
1
解决办法
2253
查看次数

如何使用 spring-boot-test 中的 ApplicationContextRunner 测试 @ConfigurationProperties?

我需要测试使用@ConfigurationProperties bean 的自动配置类。我正在使用https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-test-autoconfig 中记录的 ApplicationContextRunner进行测试更快并避免在每个变体之间启动 servlet 容器。但是,使用 @AutoconfigurationProperties 注释的 bean 不会填充注入 ApplicationContextRunner 的值。

我怀疑我遇到了类似于/sf/answers/3921617031/ 的问题

@ConfigurationProperties 不受您在测试中构建的应用程序上下文管理,尽管它们会在应用程序启动时加载,因为您的应用程序主类上有 @EnableConfigurationProperties。

如何使用 ApplicationContextRunner 启用对 @ConfigurationProperties 的支持?

下面是对应的代码

    @Test
    void ServiceDefinitionMapperPropertiesAreProperlyLoaded() {
        ApplicationContextRunner contextRunner = new ApplicationContextRunner()
            .withConfiguration(AutoConfigurations.of(
                SingleServiceDefinitionAnswerAutoConfig.class,
                DynamicCatalogServiceAutoConfiguration.class
            ))
//          .withPropertyValues(DynamicCatalogProperties.OPT_IN_PROPERTY + "=true") //Not sure why this seems ignored
            .withSystemProperties(DynamicCatalogConstants.OPT_IN_PROPERTY + "=true",
                ServiceDefinitionMapperProperties.PROPERTY_PREFIX
                +ServiceDefinitionMapperProperties.SUFFIX_PROPERTY_KEY+ "=suffix")
        ;
        contextRunner.run(context -> {
            assertThat(context).hasSingleBean(ServiceDefinitionMapperProperties.class);
            ServiceDefinitionMapperProperties serviceDefinitionMapperProperties
                = context.getBean(ServiceDefinitionMapperProperties.class);
            assertThat(serviceDefinitionMapperProperties.getSuffix()).isEqualTo("suffix");
        });
    }
Run Code Online (Sandbox Code Playgroud)

失败了:

 org.opentest4j.AssertionFailedError: 
Expecting:
 <"">
to be equal to:
 <"suffix">
but was …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-boot-test

5
推荐指数
2
解决办法
1612
查看次数

带有 WebFlux 的 Spring Boot 总是在测试中抛出 403 状态

非常感谢查看我的问题)我有一些奇怪的主题:我的春季启动测试不起作用。他们成功启动,但在向任何控制器发出请求时总是抛出 403 HTTP 状态我有一些具有下一个依赖项的项目:

buildscript {
    ext.kotlin_version = '1.3.71'

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.71"
        classpath "org.springframework.boot:spring-boot-gradle-plugin:2.2.1.RELEASE"
        classpath "com.google.cloud.tools.jib:com.google.cloud.tools.jib.gradle.plugin:1.8.0"
    }
}

plugins {
    id "org.springframework.boot" version "2.2.5.RELEASE"
    id "io.spring.dependency-management" version "1.0.9.RELEASE"
    id "com.google.cloud.tools.jib" version "1.8.0"
    id "org.jetbrains.kotlin.jvm" version "1.3.71"
    id "org.jetbrains.kotlin.plugin.spring" version "1.3.71"
    id "org.jetbrains.kotlin.plugin.jpa" version "1.3.71"
}

apply plugin: 'kotlin'

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}

repositories {
    maven {
        url "https://plugins.gradle.org/m2/"
    }
    maven {
        url "http://oss.jfrog.org/artifactory/oss-snapshot-local/"
    }
    mavenCentral()
}

kotlin {
    sourceSets {
        main.kotlin.srcDirs += 'src/main/myKotlin'
    } …
Run Code Online (Sandbox Code Playgroud)

spring spring-boot project-reactor spring-boot-test spring-webflux

5
推荐指数
1
解决办法
1906
查看次数

使用 SpringBootTest 时如何在控制器中使用 span 初始化默认跟踪上下文

我正在从 Spring Boot 1.5.21 迁移到 2.2.5,并且在此过程中也从 spring-boot-cloud 版本 Edgware.SR6 迁移到 Hoxton.SR3。这一举动迫使我放弃了侦探自己实现的跟踪器/跨度模型,并接受了勇敢的新模型。但是,我的控制器集成测试有问题。

我有一个调用Edge了一个主类的微服务EdgeApplication,我使用 Spock 作为测试框架。我的代码包括以下测试类:

@ContextConfiguration(classes = EdgeApplication.class)
@SpringBootTest(classes = EdgeApplication.class)
@ActiveProfiles(profiles = ["test"])
@AutoConfigureMockMvc
class VerificationCodeControllerSpecIT extends Specification {

  @Autowired
  MockMvc mockMvc

  def setup() {
     mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
  }

  def "Generate change password verification code"() {
    // Some code calling a PrincipalController via mockMvc.perform()
  }
}
Run Code Online (Sandbox Code Playgroud)

以前,在 Spring Boot 1.5.21 中,当调用到达 时PrincipalController,会初始化一个带有 span 的默认跟踪上下文。现在,在 Spring Boot 2 中,情况并非如此。我必须强调,这种缺乏上下文的PrincipalController情况只发生在测试代码中,而不是在微服务的实际运行中。

为什么这种行为改变了,我怎样才能恢复旧的行为,即在调用控制器时有一个带有 span 的默认跟踪上下文?

我添加了一个演示项目: …

groovy spring-boot spring-cloud-sleuth spring-boot-test

5
推荐指数
1
解决办法
687
查看次数

MockBean 和 MyBatis Mapper 不能一起工作(就像他们在 Spring Boot 2.2.7 之前所做的那样)

我使用的是 MyBatis Spring Boot Starter 2.1.3 版。自从迁移到 Spring Boot 2.2.7(我也尝试过 2.2.8 和 2.3.1,结果相同),我在使用 MockBean 注释来模拟 MyBatis 接口(例如 DAO)时遇到了问题。假设我有一个这样的界面:

@Mapper
@Repository
public interface OrderDAO {
   int insertOrder(@Param("order") Order order);
}
Run Code Online (Sandbox Code Playgroud)

我想在包含 OrderDAO 类型的字段的 OrderService 中执行集成测试并模拟此映射器。

我的集成测试用 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 注释并包含以下字段:

@MockBean
private OrderDAO orderDAO;
Run Code Online (Sandbox Code Playgroud)

当我运行这样的测试并查看对 OrderDAO 对象的引用是什么时,在我的集成测试中我看到:

com.example.dao.OrderDAO$MockitoMock$1819884459

但在我的 OrderService 类中,该字段是这样的:

com.sun.proxy.$Proxy179 (org.apache.ibatis.binding.MapperProxy@37d9310e)

因此,对 Mockito.verify 的调用显然不起作用,因为我的模拟尚未注入到我的 OrderService 类中。现在,非常奇怪的是,我发现添加此代码可以使一切正常:

@TestConfiguration
static class MockConfig {
    @Bean
    public OrderDAO orderDAO() {
        return Mockito.mock(OrderDAO.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

添加这个嵌套类以及在集成测试类上添加 ContextConfiguration 注释,现在注入到 OrderService 类中的对象是 MockitoMock —— 与测试类中的 MockBean …

mybatis spring-boot spring-mybatis spring-boot-test

5
推荐指数
1
解决办法
872
查看次数

如何在多个 SpringBootTest 之间重用 Testcontainers?

我正在使用带有 Spring Boot 的 TestContainers 为这样的存储库运行单元测试:

@Testcontainers
@ExtendWith(SpringExtension.class)
@ActiveProfiles("itest")
@SpringBootTest(classes = RouteTestingCheapRouteDetector.class)
@ContextConfiguration(initializers = AlwaysFailingRouteRepositoryShould.Initializer.class)
@TestExecutionListeners(listeners = DependencyInjectionTestExecutionListener.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Tag("docker")
@Tag("database")
class AlwaysFailingRouteRepositoryShould {

  @SuppressWarnings("rawtypes")
  @Container
  private static final PostgreSQLContainer database =
      new PostgreSQLContainer("postgres:9.6")
          .withDatabaseName("database")
          .withUsername("postgres")
          .withPassword("postgres");
Run Code Online (Sandbox Code Playgroud)

但是现在我有 14 个这样的测试,每次运行测试时都会启动一个新的 Postgres 实例。是否可以在所有测试中重用同一个实例?该Singleton模式并没有帮助,因为每次测试开始一个新的应用。

我也试过testcontainers.reuse.enable=true.testcontainers.properties.withReuse(true),但是这并没有帮助。

java spring-boot spring-boot-test testcontainers

5
推荐指数
4
解决办法
5885
查看次数

Spring 启动上下文负载测试挂起

我们有一个用 Kotlin 编写的 Spring Boot 应用程序。问题是它在 Maven 干净测试期间挂起,同时运行下面的上下文负载测试。

Java: 14.0.1 Kotlin: 1.4.20 Spring boot:2.3.6.RELEASE Spring cloud:Hoxton.SR9

@SpringBootTest
@ActiveProfiles("test")

class AppTest {

  @Test
  fun contextLoads() {
    assertTrue(true)
  }
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个线程转储并且能够看到 DataSourceInitializedPublisher 无法发布事件,因为它被阻止了

"task-2" #24 prio=5 os_prio=0 cpu=15.63ms elapsed=1851.84s tid=0x0000019de7f8d800 nid=0x7dfc waiting for monitor entry  [0x00000030ceffe000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:217)
    - waiting to lock <0x0000000704600310> (a java.util.concurrent.ConcurrentHashMap)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
    at org.springframework.context.event.AbstractApplicationEventMulticaster.retrieveApplicationListeners(AbstractApplicationEventMulticaster.java:247)
    at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:204)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:134)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:404)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:361)
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.publishEventIfRequired(DataSourceInitializedPublisher.java:110)
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.access$300(DataSourceInitializedPublisher.java:55)
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher$DataSourceSchemaCreatedPublisher.lambda$postProcessEntityManagerFactory$0(DataSourceInitializedPublisher.java:253)
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher$DataSourceSchemaCreatedPublisher$$Lambda$1023/0x000000080152fc40.run(Unknown …
Run Code Online (Sandbox Code Playgroud)

spring-data-jpa spring-boot hikaricp spring-boot-test

5
推荐指数
0
解决办法
447
查看次数