web-dev-qa-db-ja.com

mockito-インターフェイスをモックする-NullPointerExceptionをスローする

私もモックした後、nullポインタ例外が発生します。私のプロジェクト構造を見つけてください。

    //this is the pet interface
    public interface Pet{
    }

    // An implementation of Pet
    public class Dog extends Pet{
        int id,
        int petName;

    }
    // This is the Service Interface
    public interface PetService {
        List<Pet> listPets();
    }

    // a client code using the PetService to list Pets
    public class App {
        PetService petService;

        public void listPets() {
             // TODO Auto-generated method stub
             List<Pet> listPets = petService.listPets();
             for (Pet pet : listPets) {
                System.out.println(pet);
             }
        }
    }

    // This is a unit test class using mockito
    public class AppTest extends TestCase {

        App app = new App();
        PetService petService = Mockito.mock(PetService.class);
        public void testListPets(){
            //List<Pet> listPets = app.listPets();
            Pet[] pet = new Dog[]{new Dog(1,"puppy")};
            List<Pet> list = Arrays.asList(pet);
            Mockito.when(petService.listPets()).thenReturn(list);
            app.listPets();
        }
   }

私はここでTDDを使用しようとしています。つまり、サービスインターフェイスが記述されていることを意味しますが、実際の実装ではありません。 listPets()メソッドをテストするために、サービスを使用してペットのリストを取得していることを明確に理解しています。しかし、ここではAppクラスのlistPets()メソッドをテストするつもりです。そのため、サービスインターフェイスを模擬しようとしています。

ペットを取得するサービスを使用するAppクラスのlistPets()メソッド。そのため、mockitoを使用してその部分をあざけっています。

    Mockito.when(petService.listPets()).thenReturn(list);

しかし、単体テストが実行されているとき、perService.listPets()はNullPointerExceptionをスローします。これは、上記のMockito.whenコードを使用してモック化されています。これについて私を助けていただけませんか?

NullPointerExceptionは、アプリでは、petServiceを使用する前にインスタンス化されないためです。モックを注入するには、アプリで次のメソッドを追加します。

_public void setPetService(PetService petService){
    this.petService = petService;
}
_

次に、テストで次を呼び出します。

_app.setPetService(petService);
_

実行する前にapp.listPets();

5
Chris

@InjectMocksアノテーションを使用して、ゲッターやセッターを不要にすることもできます。クラスに注釈を付けた後、テストケースに以下を追加してください。

@Before
public void initMocks(){
    MockitoAnnotations.initMocks(this);
}
10