java - 如何模拟 KerberosTicket 实例?

标签 java unit-testing mocking kerberos

出于单元测试的目的,我想为 javax.security.auth.kerberos.KerberosTicket 实例提供模拟。我尝试使用 Mockito 和 PowerMockito 但都失败并出现类似的消息:

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}) 公共(public)类 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.

有人能解决这个问题吗?

最佳答案

KerberosTicket 的大多数方法都是 final,但 PowerMockito 应该能够模拟它们。

不要忘记根据 PowerMockito 的要求注释您的测试类以模拟 final 方法

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

并在测试中使用PowerMockito而不是Mockito

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

关于java - 如何模拟 KerberosTicket 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10229908/

相关文章:

javascript - sinon stub.withArgs() 用于 stub 外部函数

java - 同步改进以按特定顺序实现多线程完成

java - Spring SimpleJdbcTemplate : java. lang.OutOfMemoryError:超出GC开销限制

javascript - 如何在 Istanbul 尔编写 lambda 单元测试?

java - ArrayListMultimap 上的 PowerMock StackOveflowError

php - 当最初 stub 的方法不存在时,PHPUnit失败

java - 用 jmockit 替换继承的 final方法

java - 比较 Java 和 .NET 上的可扩展 Web 应用程序架构

java - 将动态值注入(inject) bean 的 constructor-arg 标记

node.js - 为什么使用 supertest 而不是 expressJS 的单元测试?