抽象クラスは、抽象メソッドを含む場合と含まない場合がある、abstract キーワードを使用して宣言されたクラスとして参照されます。 Java では、抽象クラスをインスタンス化することはできませんが、サブクラス化することはできます。静的フィールドと静的メソッドを含めることもできます。
このセクションでは、抽象クラスのモックまたはスパイについて説明します。非抽象メソッドを使用して抽象クラスをテストするいくつかのケースを分析します。
抽象クラスをスパイまたはモックするには、次の Maven 依存関係を追加する必要があります。
Javaのインスタンス
- JUnit
- モキト
- パワーモック
プロジェクトに必要なすべての依存関係を以下に示します。
junit junit 4.12 test org.mockito mockito-all 1.10.19 test org.powermock powermock-module-junit4 1.7.4 test org.powermock powermock-api-mockito 1.7.0 test
PowerMock の依存関係は、PowerMock を使用するテストにのみ必要です。
抽象クラスのモックの例
1. Mockito.spy() を使用した抽象クラスのスパイ
この例では、Mockito.spy() メソッドを使用して抽象クラスをスパイします。 Mockito.spy() メソッドは、抽象クラスのスパイ インスタンスを作成するために使用されます。
ステップ1: 抽象メソッドと非抽象メソッドの両方を含む Abstract1_class という名前の抽象クラスを作成します。
Abstract1_class.java
産業と工場
public abstract class Abstract1_class { public abstract int newAbstractmethod(); public String methodUnderTest() { return 'one' ; } }
ステップ2: という名前の JUnit テスト ケースを作成します。 要約1テスト 。これには、抽象クラスのスパイ インスタンスが含まれています。
Abstract1Test.java
import static org.junit.Assert.*; import org.junit.Test; import org.mockito.Mockito; import junit.framework.Assert; public class Abstract1Test { @Test public void testing_usingSpy() { Abstract1_class abstclas = Mockito.spy(Abstract1_class.class); String res = abstclas.methodUnderTest(); Assert.assertEquals('one', res); } }
出力
次の出力は、テストが正常に実行されていることを示しています。
Mockito.spy() メソッドを使用する場合の欠点は、スパイ インスタンスの作成中に抽象クラス コンストラクターを呼び出すことです。ほとんどの場合、コンストラクターは単体テストの実行に障害となる可能性のある外部依存関係を使用します。これらの外部依存関係は通常、 テストの障害 。これが、抽象クラスをモックするために Mockito.mock() メソッドを使用する理由です。
2. Mockito.mock() を使用した抽象クラスのモック化
この例では、Mockito.mock() メソッドを使用して抽象クラスをモックします。
C++でintを文字列に変換する
通常、モックはクラスのクローンまたはダミー オブジェクトを作成するために使用されます。言い換えれば、クラスのロジックやアルゴリズムが空になります。作成されたモック インスタンスには、メソッド内にコード (ロジック) は含まれません。
ステップ1: 抽象メソッドと非抽象メソッドの両方を含む Abstract_Class という名前の抽象クラスを作成します。
Abstract_Class.java
public abstract class Abstract_Class { public String sayMock() { return 'Hii.. ' + getName() + symbol() ; } private String symbol() { return '!!'; } protected abstract String getName(); }
ステップ2: という名前の JUnit テスト ケースを作成します。 抽象テストクラス 抽象クラスをモックするため。
AbstractTestClass.java
import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Test; public class AbstractTestClass { @Test public void test_AbstractClasses() { Abstract_Class ac = mock(Abstract_Class.class); when(ac.sayMock()).thenCallRealMethod(); when(ac.getName()).thenReturn('Jyotika'); assertEquals('Hii.. Jyotika!!', ac.sayMock()); } }
上記のコードでは、 そして Mockito.mock() メソッドを使用して作成されたモック化されたインスタンスです。
Javaのリストとセット
出力
次の出力は、Mockito を使用してテストが正常に実行されていることを示しています。
上記のアプローチは最善のものではありませんが、使用することはできます。次のアプローチは、PowerMock を使用し、抽象クラスで定義されたプライベート メソッドを制御できるため、推奨されます。
3. PowerMockを使用した抽象クラスのモック化
次の例では、PowerMockito.mock() メソッドを使用して抽象クラスをモックします。 Mockito.mock() の代わりに PowerMock を使用すると、静的メソッドだけでなくプライベート メソッドも制御できるため、より良いアプローチになります。
ステップ1: という名前の抽象クラスを作成します。 抽象クラス これには、抽象メソッドと非抽象メソッドの両方が含まれます。
抽象クラス.java
public abstract class Abstract_Class { public abstract int myAbstractMethod(); public String sayMock() { return getName() + '13' ; } private String getName() { return 'Jyotika'; } }
ステップ2: という名前の JUnit テスト ケースを作成します。 抽象テストクラス テスト目的のため。
AbstractTestClass.java
JavaのHelloプログラム
import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest( Abstract_Class.class) public class AbstractTestClass { @Test public void test_AbstractClassesusing_PowerMock() throws Exception { // given Abstract_Class ac = PowerMockito.mock(Abstract_Class.class); PowerMockito.doCallRealMethod().when(ac).sayMock(); PowerMockito.doReturn('Sharma').when(ac , 'getName'); //when String newstring = ac.sayMock(); //then assertEquals('Sharma13', newstring); System.out.println(newstring); } }
出力
次の出力は、PowerMock と Mockito を使用してテストが正常に実行されていることを示しています。