2016-10-07 4 views
4

私はテストについて学びたいですが、抽象クラスをテストしながらいくつかの問題に直面しています。私は、ConcreteDogのようにDogから継承する具体的なサブクラスを作成できることは知っていますが、Dogに新しい抽象メソッドを追加すると、空のメソッドをConcreteDogに追加する必要があります。それは私が推測するほどクールではないだろう。コンストラクタの引数を持つ抽象クラスをテストする

public abstract class Dog { 
    private final int id; 

    public Dog(int id) { 
    this.id = id; 
    } 

    public int getId() { 
    return id; 
    } 

    public abstract void makeSound(); 
} 

... 

public class DogTest { 
    @Test 
    public void testGetId() { 
    int id = 42; 

    // How to pass id to Dog constructor ? 
    Dog dog = Mockito.mock(Dog.class, Mockito.CALL_REAL_METHODS); 

    assertTrue(dog.getId() == id); 
    } 
} 

私はそれがmockitoで可能かどうかはわからない

Mockito.mock(Dog(id).class, Mockito.CALL_REAL_METHODS); 

のように、何とかコンストラクタでモックを呼び出しているやろうとしているが、ことを行うための方法がありますmockitoや別のツールを使用していますか?

答えて

0

犬は抽象クラスなので、最初にサブクラスを作成することをお勧めします。

class TestDog extends Dog { 
... 
} 

次に、TestDogのモックを作成し、その動作を定義する必要があります。あなたがTestDogのモックを返すTestDog.classのインスタンスを作成するときに、例えば...

TestDog mock_dog = mock(TestDog.class); 
when(mock_dog.getId()).thenReturn(99); 
whenNew(TestDog.class).withArguments(anyInt()).thenReturn(mock_dog); 

は、この試してみて、私はあなたが必要な場合は、リフレクションを使用してフィールドを設定することができます

2

をお知らせこれは基本的に、コンストラクタがメンバフィールドを設定する方法を複製します。

Dog dog = Mockito.mock(Dog.class, Mockito.CALL_REAL_METHODS); 
ReflectionTestUtils.setField(dog , "id", 42); 
関連する問題