我正在尝试在我的一个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一起运行,我就会得到上面的错误。
经过调试后,我发现这是因为系统试图产生嵌入式服务器的第二个实例。
我确信我在配置中遗漏了一些非常愚蠢的东西。 我该如何解决这个问题?
答案 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