2014-11-05 3 views
2

Я использую JMockit 1.12 и хочу проверить, вызван ли AccessController.doPrivileged(). Это кажется довольно простым:JMockit/Netbeans - проверить AccessController.doPrivileged() был вызван

@Test(expected = MissingInvocation.class) 
public void testFoo1() { 
    foo(false, true); 
} 

@Test 
public void testFoo2() { 
    foo(false, false); 
} 

@Test 
public void testFoo3() { 
    foo(true, true); 
} 

private void foo(boolean usePrivilegedAccess, boolean expectAccessControllerCall) { 
    new NonStrictExpectations(AccessController.class) {{ 
    }}; 

    if (usePrivilegedAccess) { 
     AccessController.doPrivileged((PrivilegedAction<String>)() -> ""); 
    } 

    // verify AccessController.doPrivileged was called 
    if (expectAccessControllerCall) { 
     new Verifications() {{ AccessController.doPrivileged(withAny((PrivilegedAction<Object>)() -> null)); }}; 
    } 
} 

Обратите внимание, что testFoo1() делает не вызов AccessController.doPrivileged() еще выполняет проверку в любом случае.

Я добавил этот метод, потому что обнаружил, что иногда блок Verifications будет проходить, даже если AccessController.doPrivileged(). Я использую Netbeans 8.0.1, и после большого тестирования, я обнаружил, что если я запустил тест, используя «Запуск Focused Test Method» или «Debug Focused Test Method» (выполняется только 1 тест), он проходит. Если я использую «Test File» (запускает все тесты), то testFoo1() терпит неудачу, потому что он не бросает MissingInvocation. Если я использую «тестовый файл отладки» (выполняется все тесты), он всегда терпит неудачу, если я поставлю точку останова; он с перерывами терпит неудачу, если я не поставил точку останова. Очень странно.

Является ли использование моего JMockit правильным? Я новичок, поэтому любые указатели оценили, но учтите, что я хочу запустить тот же самый тестовый код из 2 тестов, которые отличаются только логическим флагом. Я не хочу дважды копировать/вставлять тест.

Есть ли что-то с Netbeans?

Это как-то связано с инъекцией CGLib где-то в трубопроводе?

ответ

0

Возможно, что во время теста AccessController.doPrivileged(...) вызывается из другого места, возможно, из NetBeans или, скорее всего, из самой JRE.

JMockit 1.x не ограничивает насмешку класса AccessController только методом foo(boolean,boolean); вместо этого он регистрирует все призывы к своим методам, независимо от того, откуда они происходят. Тест должен был бы выполнить более ограничительную проверку, возможно, проверку точного экземпляра PrivilegedAction, переданного методу издевательства, или даже путем проверки стека вызовов, чтобы узнать, откуда он.

Для JMockit 2 запланировано изменение API, чтобы издевательствовалось только для классов с @Tested, избегая подобных ситуаций.

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