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及以下LinkageException @PrepareForTest注释结果:
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 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.
是否有人有一个解决方案为了这?
感谢您的答复。 我已经添加了RunWith和PrepareForTest,但面对不同的错误,这就是为什么我开始删除它们。重新添加它们会产生以下错误: java.lang.LinkageError:加载器约束违例:解析方法时“sun.security.jgss.krb5.Krb5Util.getTicketFromSubjectAndTgs(ILjava/lang/String; Ljava/lang/String; Ljava /郎/字符串; Ljava /安全/的AccessControlContext)Ljavax /安全/认证/的Kerberos/KerberosTicket;”当前类的类加载器(org/powermock/core/classloader/MockClassLoader的实例), – Marcel 2012-04-24 12:53:03
org/epo/security/spnego/impl/KerberosUtilsTest,以及用于解析的类,sun/security的类加载器(实例)/jgss/krb5/Krb5Util,在签名中使用类型为javax/security/auth/kerberos/KerberosTicket的不同类对象 我已将测试代码添加到问题中。 –
Marcel
2012-04-24 12:53:51