ユニットテストのために、私はjavax.security.auth.kerberos.KerberosTicketインスタンスのモックを提供したいと思います。私はMockitoとPowerMockitoを使用してみましたが、両方とも同様のメッセージで失敗しました:LinkageExceptionを以下に@RunWithと@PrepareForTest注釈結果を追加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.
:
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.
誰かが解決策を持っていますこのため?
感謝を
PowerMockito
代わりにMockito
を使用するようにテストクラスに注釈を付けることを忘れないでください。 私は既にRunWithとPrepareForTestを追加しましたが、異なるエラーに直面していました。それらを再度追加し直すと、次のエラーが発生します。 java.lang.LinkageError:ローダー制約違反:メソッドを解決するときに "sun.security.jgss.krb5.Krb5Util.getTicketFromSubjectAndTgs(ILjava/lang/String; Ljava/lang/String; Ljava/lang/String; Ljava/security/AccessControlContext;)Ljavax/security/auth/kerberos/KerberosTicket;現在のクラス – Marcelorg/epo/security/spnego/impl/KerberosUtilsTestのクラスローダ(org/powermock/core/classloader/MockClassLoaderのインスタンス)、解決されたクラスsun/securityのクラスローダ(インスタンス)/jgss/krb5/Krb5Utilは、署名に使用されるjavax/security/auth/kerberos/KerberosTicket型の異なるClassオブジェクトを持っています 質問にテストコードを追加しました。 –
Marcel