簡體   English   中英

JUNIT-在Spring Data JPA中調用findAll時,空指針異常

[英]JUNIT - Null pointer Exception while calling findAll in spring Data JPA

我是Junits和Mockito的新手,我正在編寫一個單元測試類來測試我的服務類CourseService.java,它正在調用CourseRepository.class的findAll( )方法,該方法實現了CrudRepository<Topics,Long>

服務等級

@Service
public class CourseService {

    @Autowired
    CourseRepository courseRepository;

    public void setCourseRepository(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

    public Boolean getAllTopics() {

        ArrayList<Topics> topicList=(ArrayList<Topics>) courseRepository.findAll();
        if(topicList.isEmpty())
        {
            return false;
        }
        return true;
    }
}

儲存庫類

public interface CourseRepository extends CrudRepository<Topics,Long>{

}

域類

@Entity
@Table(name="Book")
public class Topics {

    @Id
    @Column(name="Topicid")
    private long topicId;

    @Column(name="Topictitle",nullable=false)
    private String topicTitle;

    @Column(name="Topicauthor",nullable=false)
    private String topicAuthor;

    public long getTopicId() {
        return topicId;
    }
    public void setTopicId(long topicId) {
        this.topicId = topicId;
    }

    public String getTopicTitle() {
        return topicTitle;
    }
    public void setTopicTitle(String topicTitle) {
        this.topicTitle = topicTitle;
    }
    public String getTopicAuthor() {
        return topicAuthor;
    }
    public void setTopicAuthor(String topicAuthor) {
        this.topicAuthor = topicAuthor;
    }
    public Topics(long topicId, String topicTitle, String topicAuthor) {
        super();
        this.topicId = topicId;
        this.topicTitle = topicTitle;
        this.topicAuthor = topicAuthor;
    }
}

以下是我編寫的Junit類,但是courseRepository被初始化為NULL,因此我得到了NullPointerException

public class CourseServiceTest {

    @Mock
    private CourseRepository courseRepository;

    @InjectMocks
    private CourseService courseService;

    Topics topics;

    @Mock
    private Iterable<Topics> topicsList;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(CourseServiceTest.class);
    }
    @Test
    public void test_Get_Topic_Details() {

        List<Topics> topics = new ArrayList<Topics>();
        Mockito.when(courseRepository.findAll()).thenReturn(topics);
        boolean result=courseService.getAllTopics();
        assertTrue(result);
    }
}

setUp()方法更改為:

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

可能您正在處理框架上的某些問題,以使模擬類由框架注入。

我建議使用Constructor Injection ,因此您無需依賴反射和@Inject / @Mock批注即可完成此工作:

@Service
public class CourseService {

    private final CourseRepository courseRepository;

    // @Autowired annotation is optional when using constructor injection
    CourseService (CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

    // .... code

}

考試:

@Test
public void test_Get_Topic_Details() {

    List<Topics> topics = new ArrayList<Topics>();
    Mockito.when(courseRepository.findAll()).thenReturn(topics);

    CourseService courseService = new CourseService(courseRepository);
    boolean result = courseService.getAllTopics();
    assertTrue(result);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM