2012-04-19 5 views
1

Для модульных испытаний я хочу предоставить макет для экземпляра javax.security.auth.kerberos.KerberosTicket. Я попытался с помощью Mockito и PowerMockito, но оба потерпели неудачу с подобным сообщением:Как я могу издеваться над экземпляром KerberosTicket?

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
    Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 

Добавление @RunWith и @PrepareForTest аннотаций результаты в следующем LinkageException:

java.lang.LinkageError: 
    loader constraint violation: 
    when resolving method "sun.security.jgss.krb5.Krb5Util.getTicketFromSubjectAndTgs(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/security/AccessControlContext;)Ljavax/security/auth/kerberos/KerberosTicket;" 
    the class loader (instance of org/powermock/core/classloader/MockClassLoader) of the current class, 
    org/epo/security/spnego/impl/KerberosUtilsTest, and the class loader (instance of <bootloader>) 
    for resolved class, sun/security/jgss/krb5/Krb5Util, have different Class objects 
    for the type javax/security/auth/kerberos/KerberosTicket used in the signature 

Мой тестовый класс выглядит следующим образом:

@RunWith(PowerMockRunner.class) 

@PrepareForTest ({KerberosTicket.class}) общественного класса KerberosUtilsTest {

@Test 
public void testGetTicketFromSubjectAndTgs() throws LoginException, KrbException, IOException { 
    PowerMockito.mockStatic(Krb5Util.class); 
    KerberosTicket kerberosTicketMock = PowerMockito.mock(KerberosTicket.class); 

    AccessControlContext controlContext = AccessController.getContext(); 

    // Causes the LinkageError to be thrown 
    when(Krb5Util.getTicketFromSubjectAndTgs(-1, "test", "test", "test", controlContext)).thenReturn(
       kerberosTicketMock); 

    KerberosTicket actual = new KerberosUtils().getTicketFromSubjectAndTgs(-1, "test", "test", "test", 
       controlContext); 

    assertEquals(kerberosTicketMock, actual); 
} 

Поиск в Интернет показал, что LinkageError может быть исправлена ​​путем изменения аннотацию, как, например:

@PowerMockIgnore({"sun.security.jgss.krb5.Krb5Util", "javax.security.auth.kerberos.KerberosTicket"}) 
@PrepareForTest({KerberosUtils.class}) 
@RunWith(PowerMockRunner.class) 

Запуск этого получает меня возвращается на круги своя:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
    Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 

ли кто-то есть решение для этого?

ответ

1

Большинство методов KerberosTicket: final, но PowerMockito должен быть в состоянии имитировать их.

Не забудьте аннотировать тестовый класс в соответствии с требованиями PowerMockito издеваться final методы

@RunWith(PowerMockRunner.class) 
@PrepareForTest(KerberosTicket.class) 

и использовать PowerMockito вместо Mockito внутри теста

KerberosTicket mock = PowerMockito.mock(KerberosTicket.class); 
PowerMockit.when(mock.getAuthTime().thenReturn(...); 
+0

Спасибо за ваш ответ. Я уже добавил RunWith и PrepareForTest, но столкнулся с разными ошибками, поэтому начал их удалять. Повторное добавление их снова дает эту ошибку: java.lang.LinkageError: нарушение ограничения загрузчика: при разрешении метода «sun.security.jgss.krb5.Krb5Util.getTicketFromSubjectAndTgs (ILjava/lang/String; Ljava/lang/String; Ljava/языки/String; Ljava/безопасность/AccessControlContext;) Ljavax/безопасность/аутентификации/Керберос/KerberosTicket;» загрузчик классов (экземпляр org/powermock/core/classloader/MockClassLoader) текущего класса, – Marcel

+0

org/epo/security/spnego/impl/KerberosUtilsTest и загрузчик классов (экземпляр ) для разрешенного класса, солнце/безопасность/jgss/krb5/Krb5Util, имеют разные объекты класса для типа javax/security/auth/kerberos/KerberosTicket, используемые в сигнатуре Я добавлю свой тестовый код к вопросу. – Marcel

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