使用Spring LDAP嵌入式服务器运行测试时“已使用的地址”

时间:2017-11-14 17:28:16

标签: testing spring-boot spring-ldap unboundid-ldap-sdk

我正在尝试在我的一个Spring Boot项目中使用Spring LDAP,但是在运行多个测试时我收到了“Address in in use”错误。

我在这里克隆了示例项目: https://spring.io/guides/gs/authenticating-ldap/

...并且刚刚添加了通常由Spring Boot创建的样板测试,以验证应用程序上下文是否正确加载:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyApplicationTests {
    @Test
    public void contextLoads() {
    }
}

如果单独运行,则此测试通过。一旦LdapAuthenticationTests和MyApplicationTests一起运行,我就会得到上面的错误。

经过调试后,我发现这是因为系统试图产生嵌入式服务器的第二个实例。

我确信我在配置中遗漏了一些非常愚蠢的东西。 我该如何解决这个问题?

5 个答案:

答案 0 :(得分:4)

好的,我认为通过在测试类中添加@DirtiesContext注释找到了解决方案:

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)

答案 1 :(得分:2)

我遇到了类似的问题,好像您已配置了静态端口(就我而言)。

根据this article

  

Spring Boot为每个应用程序启动一个嵌入式LDAP服务器   上下文。从逻辑上讲,这意味着它将启动嵌入式LDAP服务器以用于   每个测试班。实际上,自Spring以来,这并不总是正确的   引导缓存并重用应用程序上下文。但是,你应该   总是期望有多个LDAP服务器在运行   执行测试。因此,您可能无法声明以下端口   您的LDAP服务器。这样,它将自动使用空闲端口。   否则,您的测试将失败,并显示“地址已在使用中”

因此,最好不要完全定义{props.clusters.map(cluster => ( <MarkerClusterer averageCenter enableRetinaIcons gridSize={60} onClick={(markerClusterer) => { const clickedMarkers = markerClusterer.getMarkers() }} > {cluster.markers.map(marker => ( <Marker id={ marker.id} position={{ lat: marker.lat, lng: marker.lng }} /> ))} </MarkerClusterer> ))}

答案 2 :(得分:0)

尝试指定Web环境类型和基本配置类(在其上使用!SpringBootApplication)。

@RunWith(SpringRunner.class)
@SpringBootTest(
    classes = MyApplication.class,
    webEnvironment = RANDOM_PORT
)
public class MyApplicationTests {
    @Test
    public void contextLoads() {
    }
}

为所有测试类执行此操作。

答案 3 :(得分:0)

我解决了同样的问题。我可以使用一个额外的TestExecutionListener来解决它,因为您可以获得InMemoryDirectoryServer bean。

/**
 * @author slemoine
 */
public class LdapExecutionListener implements TestExecutionListener {

    @Override
    public void afterTestClass(TestContext testContext) {
        InMemoryDirectoryServer ldapServer = testContext.getApplicationContext().getBean(InMemoryDirectoryServer.class);
        ldapServer.shutDown(true);
    }
}

在每个SpringBootTest上(或在抽象超类中仅一次)

@RunWith(SpringRunner.class)
@SpringBootTest
@TestExecutionListeners(listeners = LdapExecutionListener.class,
        mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS)
public class MyTestClass {

...

}

也不要忘记

mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS

避免禁用整个@SpringBootTest自动配置。

答案 4 :(得分:0)

如果您使用的是Spring Embedded ldap,请尝试从配置文件中注释或删除端口值,如下所示:

spring :
  ldap:
    embedded:
      base-dn: dc=example,dc=org
      credential:
        username: cn=admin,dc=example,dc=org
        password: admin
      ldif: classpath:test-schema.ldif
      # port: 12345
      validation:
        enabled: false