2016-07-17 6 views
0

У меня есть проект, в котором мы используем JNDI для запроса записей DNS. Сам проект работает очень сильно, однако я не смог найти простой и независимый способ тестирования JNDI-зависимых компонентов с помощью jUnit.mocking JNDI DNS-интерфейс

Код далеко от науки о ракетах и ​​очень похож на типичный DNS-запрос ванильного JNDI.

В настоящее время я указываю тестовые единицы на общедоступные записи DNS (записи A, MX, TXT), но это своего рода нет.

... 
    Hashtable env = new Hashtable(); 
    env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); 
    env.put("com.sun.jndi.dns.timeout.initial", timeOut); 
    env.put("com.sun.jndi.dns.timeout.retries", retries); 
    env.put("java.naming.provider.url", dns:); 
    } 

    Attributes attrs; 

    try { 
     DirContext ictx = new InitialDirContext(env); 
     attrs = ictx.getAttributes(queryInput, new String[]{queryType}); 
     return attrs; 
    } catch (NameNotFoundException e) { 
     getLogger().debug("Resolution for domain {} failed due to {}", new Object[]{queryInput, e}); 
     attrs = new BasicAttributes(queryType, "NXDOMAIN",true); 
     return attrs; 

Есть ли способ ввода сигналов TXT и A в JNDI?

ответ

0

Оказывается, что можно использовать традиционные JNDI имитировали стратегии (например, с помощью Mockito.when), но ногтей условие для метода GetAttributes, как показано в примере кода ниже:

@Before 
public void setupTest() throws Exception { 
    this.queryDNS = new QueryDNS(); 
    this.queryDNSTestRunner = TestRunners.newTestRunner(queryDNS); 

    Hashtable env = new Hashtable<String, String>(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, FakeDNSInitialDirContextFactory.class.getName()); 

    this.queryDNS.initializeContext(env); 

    final DirContext mockContext = FakeDNSInitialDirContextFactory.getLatestMockContext(); 

    // Capture JNDI's getAttibutes method containing the (String) queryValue and (String[]) queryType 
    Mockito.when(mockContext.getAttributes(Mockito.anyString(), Mockito.any(String[].class))) 
      .thenAnswer(new Answer() { 
       public Object answer(InvocationOnMock invocation) throws Throwable { 
        // Craft a false DNS response 
        // Note the DNS response will not make use of any of the mocked 
        // query contents (all input is discarded and replies synthetically 
        // generated 
        return craftResponse(invocation); 
       } 
      }); 
} 

И

// Dummy pseudo-DNS responder 
private Attributes craftResponse(InvocationOnMock invocation) { 
    Object[] arguments = invocation.getArguments(); 
    String querySubject = arguments[0].toString(); 
    String[] queryType = (String[]) arguments[1]; 

    // Create attribute 
    Attributes attrs = new BasicAttributes(true); 
    BasicAttribute attr; 

    switch (queryType[0]) { 
     case "AAAA": 
      attr = new BasicAttribute("AAAA"); 
      attrs.put(attr); 
      break; 
     case "TXT": 
      attr = new BasicAttribute("TXT", "666 | 123.123.123.123/32 | Apache-NIFI | AU | nifi.org | Apache NiFi"); 
      attrs.put(attr); 
      break; 
     case "PTR": 
      attr = new BasicAttribute("PTR"); 
      attr.add(0, "eg-apache.nifi.org."); 
      attr.add(1, "apache.nifi.org."); 
      attrs.put(attr); 
      break; 
    } 
    return attrs; 
} 

Надеюсь, это поможет людям в будущем.