2014-12-17 5 views
5

Я пытаюсь установить встроенный ldap для модульного теста с помощью Spring Ldap. Но мне нужно использовать настраиваемую схему для пользовательских определений objectClasses/attributes. Как я могу настроить его с помощью теста Spring Ldap (LdapTestUtils?)Тестирование модуля Spring Ldap с использованием пользовательской схемы

На самом деле, если я запускаю тест, она не справится о том, что мой пользовательский объектный «грецкий» не определен в схеме со следующим сообщением:

org.springframework.ldap.UncategorizedLdapException: Failed to populate LDIF; nested exception is javax.naming.directory.NoSuchAttributeException: [LDAP: error code 16 - NO_SUCH_ATTRIBUTE: failed for  Add Request : 
... 
: OID for name 'myOb' was not found within the OID registry]; remaining name 'cn=123456, ou=MyUser, o=company.com' 

Если я прокомментирую objectClass: myOb из ldif, сбой теста с нулевым значением (атрибут не читается).

Вот мой тестовый класс:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = LdapConfiguration.class, loader = AnnotationConfigContextLoader.class) 
public class LdapTest { 

    // Ldap port 
    private static final int LDAP_PORT = 18880; 

    // Base DN for test data 
    private static final LdapName baseName = LdapUtils.newLdapName("o=company.com"); 

    @Autowired 
    LdapTemplate ldapTemplate; 

    @BeforeClass 
    public static void setupBeforeClass() { 
     LdapTestUtils.startEmbeddedServer(LDAP_PORT, baseName.toString(), "ldaptest"); 
     // How to load schema definition ? 
    } 

    @AfterClass 
    public static void teardownAfterClass() throws Exception { 
     LdapTestUtils.shutdownEmbeddedServer(); 
    } 

    @Before 
    public void setup() throws Exception { 
     LdapTestUtils.cleanAndSetup(ldapTemplate.getContextSource(), baseName, new ClassPathResource("ldap/test-users.ldif")); 
    } 


    @Test 
    public void testSearchLdap() throws Exception {  
     String myObId = ldapTemplate.lookup(LdapNameBuilder.newInstance("ou=MyUser, o=company.com").add("cn", "123456").build(), new AbstractContextMapper<String>() { 
      @Override 
      protected String doMapFromContext(DirContextOperations ctx) { 
       return ctx.getStringAttribute("myObId"); // custom type 
      }   
     }); 
     Assert.assertNotNull(myObId); // myObId is null if I comment `objectClass: myOb` ! 
    } 
} 

и мой LDIF:

dn: ou=MyUser, o=company.com 
ou: User 
description: MyUser 
objectClass: top 
objectClass: organizationalunit 

dn: cn=123456, ou=MyUser, o=company.com 
objectClass: top 
objectClass: person 
objectClass: myOb 
cn: 123456 
sn: 823456 
myObId: TEST 
+0

Привет, я смотрю на такая же проблема. Удалось ли вам это решить или вы использовали обходное решение, предложенное ниже, в конце? – Jan

+0

Да, я использую серверное решение 'InMemoryDirectoryServer', предложенное ниже – Aure77

+0

Хорошо, спасибо, похоже, что мне нужно будет сделать то же самое ... – Jan

ответ

1

Я не знаю, как сделать это с весны Ldap ... Но я использую Unboundid InMemoryDirectoryServer в мои модульные тесты. Эта реализация сервера не ограничивает какие-либо пользовательские определения objectClasses/attributes. Если вы хотите, я могу поделиться своим JUnitRule здесь. Правило начинается InMemory сервер и загружает в него Ldiff

ОБНОВЛЕНО:

public class LdapServerRule extends ExternalResource { 
private static final Log LOG = LogFactory 
     .getLog(LdapServerRule.class); 

public static final String DefaultDn = "cn=Directory Manager"; 
public static final String DefaultPassword = "password"; 
private String baseDn; 
private String dn; 
private String password; 
private String lDiffPath; 
private InMemoryDirectoryServer server; 
private int listenPort; 

public LdapServerRule(String baseDn, String lDiffPath) { 
    this(baseDn, lDiffPath, 0); 
} 


public LdapServerRule(String baseDn, String lDiffPath, int listenPort) { 
    this.lDiffPath = lDiffPath; 
    this.baseDn = baseDn; 
    this.dn = DefaultDn; 
    this.password = DefaultPassword; 
    this.listenPort = listenPort; 

} 

@Override 
protected void before() { 
    start(); 
} 

@Override 
protected void after() { 
    stop(); 
} 

public int getRunningPort() { 
    return getServer().getListenPort(); 
} 

private void start() { 
    InMemoryDirectoryServerConfig config; 

    try { 
     LOG.info("LDAP server " + toString() + " starting..."); 
     config = new InMemoryDirectoryServerConfig(getBaseDn()); 
     config.addAdditionalBindCredentials(getDn(), 
       getPassword()); 
     config.setSchema(null); 
     config.setListenerConfigs(
       InMemoryListenerConfig.createLDAPConfig("LDAP", getListenPort())); 
     setServer(new InMemoryDirectoryServer(config)); 

     getServer().importFromLDIF(true, getLDiffPath()); 
     getServer().startListening(); 
     LOG.info("LDAP server " + toString() + " started. Listen on port " + getServer().getListenPort()); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 

} 

private void stop() { 
    server.shutDown(true); 
    LOG.info("LDAP server " + toString() + " stopped"); 
} 

public String getBaseDn() { 
    return baseDn; 
} 

public String getDn() { 
    return dn; 
} 

public String getPassword() { 
    return password; 
} 

public InMemoryDirectoryServer getServer() { 
    return server; 
} 

public void setServer(InMemoryDirectoryServer server) { 
    this.server = server; 
} 

public String getLDiffPath() { 
    return lDiffPath; 
} 

public int getListenPort() { 
    return listenPort; 
} 

@Override 
public String toString() { 
    return com.google.common.base.Objects.toStringHelper(this) 
      .add("baseDn", baseDn) 
      .add("listenPort", listenPort) 
      .toString(); 
} 

}

Вы можете использовать это правило, как этот

@ClassRule 
public static final LdapServerRule LDAP_RULE = 
     new LdapServerRule("dc=mmkauth", resourceFilePath("data.ldiff")); 

LDAP_RULE.getListenPort() возвращает фактическое порт для подключения, или вы можете передать порт непосредственно в конструктор

+0

LdapTestUtils использует ApacheDS. Я очень переживаю по вашему модулю тестового теста, когда вы находитесь на сервере каталога памяти! можете ли вы поделиться им, пожалуйста? – Aure77

+0

Любая зависимость maven для InMemoryDirectoryServer? EDIT: найдено http://mvnrepository.com/artifact/com.unboundid/unboundid-ldapsdk – Aure77

+0

@ Aure77 Я обновил ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^