1. 程式人生 > >Spring環境下使用TestNG進行單元測試及出現的各種問題

Spring環境下使用TestNG進行單元測試及出現的各種問題

今天在用Spring整合MyBatis後,在使用單元測試時發現了一些坑

package com.germa.service;

import com.germa.domain.Forum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.testng.annotations.Test;


@ContextConfiguration("classpath:applicationContext-mybatis.xml")
@Rollback(false)
public class TestMyBatis extends
        AbstractTransactionalTestNGSpringContextTests {

    private ForumService forumService;
    @Autowired
    public void setForumService(ForumService forumService) {
        this.forumService = forumService;
    }

    @Test
    public void testAddForum(){
        //ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext-mybatis.xml");
       // this.forumService=(ForumService)ctx.getBean("forumService");
        Forum forum=new Forum();
        forum.setForumId(3);
        forum.setForumName("forum3");
        forum.setForumDesc("Desc3");
        this.forumService.addForum(forum);
    }
    
}

第一個坑:在一開始測試時我直接新建一個測試類,並給類註解@ContextConfiguration("classpath:applicationContext-mybatis.xml"),想通過註解自動載入配置檔案,然後在直接在想要測試的方法前加了testng的@Test,一執行,報錯NullPointerException,然後我試了在方法內部用ApplicationContext手動載入,結果就可以了,發現是想要的Bean沒有被自動注入,網上查了一下,原來在測試類想要融入Spring環境下(註解自動載入配置檔案),必須extends 一個叫AbstractTransactionalTestNGSpringContextTests的類,此時,問題得以解決。

第二個坑:方法成功執行,結果卻在資料庫看不到相應的結果,困頓許久,看了下測試產生的資訊,原來是繼承AbstractTransactionalTestNGSpringContextTests在測試時會自動啟動事務,自動回滾,這時,只需要給測試類註解@RollBack(false)即可。

後續有坑再補