mockito - mocking an interface - throwing NullPointerExcepti



我在嘲笑后也得到了空指针异常。请找到我的项目结构。

    //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代码模拟了它。你能帮我吗?

您也可以使用@InjectMocks注释,这样您就不需要任何getter和setter。只需确保在注释类后在测试用例中添加以下内容,

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

NullPointerException 是因为,在应用程序中,petService 在尝试使用它之前没有实例化。若要注入模拟,请在 App 中添加此方法:

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

然后在测试中,调用:

app.setPetService(petService);

运行app.listPets();之前

相关内容

  • 没有找到相关文章

最新更新