私もモックした後、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();
@InjectMocks
アノテーションを使用して、ゲッターやセッターを不要にすることもできます。クラスに注釈を付けた後、テストケースに以下を追加してください。
@Before
public void initMocks(){
MockitoAnnotations.initMocks(this);
}