Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟KerberosTicket实例?_Java_Unit Testing_Mocking_Kerberos - Fatal编程技术网

Java 如何模拟KerberosTicket实例?

Java 如何模拟KerberosTicket实例?,java,unit-testing,mocking,kerberos,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 e

出于单元测试的目的,我想为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
@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);
}
搜索internet发现,可以通过更改注释来修复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(...);

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

别忘了按照PowerMockito的要求对测试类进行注释,以模拟
final
方法

@RunWith(PowerMockRunner.class)
@PrepareForTest(KerberosTicket.class)
并在测试中使用
PowerMockito
而不是
Mockito

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

感谢您的回复。我已经添加了RunWith和PrepareForTest,但遇到了不同的错误,这就是我开始删除它们的原因。再次添加它们会产生以下错误:java.lang.LinkageError:loader约束冲突:解析方法“sun.security.jgss.krb5.Krb5Util.getTicketFromSubjectAndTgs”时(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/security/AccessControlContext;)Ljavax/security/auth/kerberos/KerberosTicket;“当前类的类加载器(org/powermock/core/classloader/MockClassLoader实例)、org/epo/security/spnego/impl/KerberosUtilsTest和类加载器(的实例)对于解析类sun/security/jgss/krb5/Krb5Util,签名中使用了不同类型的类对象javax/security/auth/kerberos/KerberosTicket,我已将测试代码添加到问题中。感谢您的回答。我已经添加了RunWith和prepareForest,但遇到了不同的错误,这就是我开始删除它们的原因。重新添加它们再次给出此错误:java.lang.LinkageError:loader约束冲突:解析方法“sun.security.jgss.krb5.Krb5Util.getTicketFromSubjectAndTgs(ILjava/lang/String;Ljava/lang/String;Ljava/security/AccessControlContext;)Ljavax/security/auth/kerberos/KerberosTicket;”类加载器当前类的(org/powermock/core/classloader/MockClassLoader的实例)、org/epo/security/spnego/impl/KerberosUtilsTest和类加载器(的实例)对于解析类sun/security/jgss/krb5/Krb5Util,在签名中使用了javax/security/auth/kerberos/KerberosTicket类型的不同类对象,我已将测试代码添加到问题中。