静的メソッドのユニットテストをいくつか作成しました。staticメソッドは引数を1つだけ取ります。引数の型は最終クラスです。コードに関して:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
そのため、Utility
クラスUtilityTests
について、このメソッドのテストを記述したテストクラスを作成しましたgetName
。ユニットテストフレームワークはTestNGであり、使用されるモックライブラリはMockito
です。したがって、一般的なテストの構造は次のとおりです。
public class UtilityTests {
@Test
public void getNameTest() {
// Arrange
Customer customerMock = Mockito.mock(Customer.class);
Mockito.when(...).thenReturn(...);
// Act
Optional<String> name = Utility.getName(customerMock);
// Assert
Assert.assertTrue(...);
}
}
何が問題ですか ?
テストはローカルでIntelliJ内で正常に実行されますが、Jenkinsでは失敗します(コードをリモートブランチにプッシュすると、ビルドがトリガーされ、ユニットテストが最後に実行されます)。エラーメッセージは次のようなものです。
org.mockito.exceptions.base.MockitoException:クラスをモック/スパイできませんcom.packagename.Customer Mockitoは次の理由でモック/スパイできません:-最終クラス
何を試しましたか?
解決策を見つけるために少し検索しましたが、解決できませんでした。ここで、最終クラスであることを変更することは許可されていません。これに加えて、可能であれば、デザインをまったく変更しないようにしたいと思います(たとえば、モックしたいメソッドを保持し、Customerクラスがそのインターフェイスを実装していることを示すインターフェイスを作成します)。コメント)。私が試したのは、mockito-finalで言及された2番目のオプションです。これが問題を修正したという事実にもかかわらず、それは他のいくつかのユニットテストを壊します:(、それは明白な方法で修正することができません。Customer
ご質問
だからここに私が持っている2つの質問があります:
- そもそもそれはどのように可能ですか?ローカルとJenkinsの両方でテストが失敗するべきではありませんか?
- 上記の制約に基づいてこれをどのように修正できますか?
助けてくれてありがとう。
Customer
ロジックはありますか、それとも単なるデータクラスですか?ゲッターとセッターを持つフィールドの集まりの場合は、インスタンス化できます。
enable final
構成はワークスペースで機能しますが、実行するとJenkins
このファイルが見つかりません。Jenkins
ファイルを探している場所と、実際にそこにあるかどうかを確認します。