中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot單元測試使用@Test沒有run方法的解決方案是什么

發布時間:2022-01-17 19:19:37 來源:億速云 閱讀:264 作者:kk 欄目:開發技術

SpringBoot單元測試使用@Test沒有run方法的解決方案是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

SpringBoot單元測試使用@Test沒有run方法

重新建測試類發現@Test又有用,結果發現是因為默認的Tests測試類沒有public關鍵字!

SpringBoot單元測試使用@Test沒有run方法的解決方案是什么

SpringBoot單元測試使用@Test沒有run方法的解決方案是什么

這個破錯改了兩小時。。。

==后續來了:==

原因找到了

建項目的時候是默認的2.3.0,所以默認創建的類結構應該是2.3.0版本的。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

emmm。之前因為改成了2.1.7.RELEASE,版本不同,項目的結構也不同。

現在用回2.3.0RELEASE

是可以正常跑的。。。而且也沒有了@RunWith注解

SpringBoot單元測試使用@Test沒有run方法的解決方案是什么

SpringBoot寫單元測試遇到的坑

近期,項目需要寫單元測試。我著手的項目是用SpringBoot寫的。所以就簡單的研究了一下如何使用。在使用中遇到不少問題,不得已換了一種方式寫測試用例,寫完之后總感覺不太爽。今天在Spring官網上學一個新的用法,發現這種測試方法使用后沒有問題。所以來寫一點筆記。

SpringBoot怎么寫單元測試

SpringBoot提供注解的方式編寫單元測試,可以使用SpringBootTest注解來標示測試類。

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootTest{
@Test
public void method(){
}
}

這樣寫只能解決沒有一些配置文件的測試邏輯,比如沒有數據庫配置、數據庫連接池配置等。如果有這些配置,你就需要這樣寫了。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@Test
public void method(){
}

這樣就可以正常運行了。

測試controller類。使用了Mock,網上大多流傳的是下面這種方法,添加@WebAppConfiguration,使用MockMvc去進行單元測試,但是我的項目如下使用就出現了問題,執行的時候找不到Controller類,網上百度了各種方法都不管用。都會報 no bean of 'controller' type found錯誤。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
 public class ControllerTest { 
    private MockMvc mockMvc; 
    @Autowired
    private WebApplicationContext wac; 
    @Before // 在測試開始前初始化工作
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }
 
    @Test
    public void getMessageTest() throws Exception { 
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/test/getMessage"))
                .andDo(MockMvcResultHandlers.print()).andReturn();
 
        int status = mvcResult.getResponse().getStatus();
        String content = mvcResult.getResponse().getContentAsString();
 
        Assert.assertTrue("success", status == 200);
        Assert.assertFalse("failed", status != 200); 
        System.out.println("content" + content);  
    }

后來換了一種方式直接new個controller。測試運行后不報no bean of 'controller' type found錯誤了,但是在controller中使用的service報了空指針異常NPE,傳遞性就很明顯了,controller是new的一個對象,所以注解不起作用,service就為null。

最后通過使用@AutoConfigureMockMvc+@MockBean的方式可以實現簡單的單元測試,并且不會對數據產生影響,且不會對數據庫產生影響。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc
public class ImkfMessageReportControllerTest {
    /**
     * 初始化MockMvc
     */
    @Autowired
    private MockMvc mvc;
 
    /**
     * 測試的controller
     */
    @MockBean
    private UserController userController;
 
    @Test
    public void getUserListTest() throws Exception {
        MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get("/user/getUserList"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        String content = mvcResult.getResponse().getContentAsString();
        System.out.println("content" + content);
 
    }

SpringBoot使用Mockito進行單元測試

上面是使用MockMvc,雖然能夠驗證短鏈接甚至service代碼邏輯的正確性,能夠正常測試接口的問題。但是缺點也不少,比如,覆蓋率并沒有提升。Mockito是一個非常好用的單元測試工具,它的實現原理是繼承要Mock的類,將所有的公有方法進行重寫

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
 
    @Mock
    private UserMapper userMapper;
 
    @InjectMocks
    private UserService userService;
 
    @Test
    public void saveTest() throws Exception {
        User user = new User();
        user.setUserName(Long.valueOf("springBoot"));
        when(userMapper.insert(user)).thenReturn(user);
        int num = userService.save(user);
        Assert.assertEquals("success", 1, 1);  
    } 
}

使用RunwWith(MockitoJUnitRunner.class)(也可以使用SpringBootRunner.class)來進行mocktio測試,注解@Mock標記一個類或者接口是需要被mock的,在Mock的過程中就相當于@Resource,但是注意一點是Mock是繼承or實現了Mock的類,所以Mock出來的方法,全是null或者返回值為null。@InjectMocks將所有的mock對象都放入需要測試的類的對象中。在上面的saveTest方法里面調用到UserMapper.insert(),那么需要對UserMapper.insert()進行打樁,設置預期返回值。

打樁的時候需要注意:傳遞的參數(如果有)必須為調用時的同一個對象或者相同值,如果傳入的參數是一個對象,那么需要對這個對象進行打樁,再打樁這個方法。比如,when(userMapper.insert(user)).thenReturn(rUser),插入一個user對象,如果user插入之前要進行校驗或者其他操作,需要對這個對象進行打樁(當然pojp對象可以直接new)。

如果插入的對象非常復雜,用構造方法來構造一個空對象,或者構造方法所用的對象不能直接構造,但是沒有public的方法來設置值,該如何解決這個問題?我們知道一個對象的類可能有get方法(不一定是get,但是只要我們想獲取這個對象中的參數,那么就有public的方法獲取),我們可以通過Mock這個對象,在將要測試的方法體內,如果某行調用了這個對象的任意方法(toString()、equals()、get()),我們都可以以相同的參數(如果遇到參數未知可以用any(),一般都能知道)進行打樁后設置返回值,這樣就能通過參數校驗等環節,執行后面的代碼邏輯,同時能夠提高覆蓋率,偽代碼如下。

 @Mock
 private User user;  
 when(user.get(eq("userName"))).thenReturn("testAdmin");
 when(user.get(eq("seq"))).thenReturn(4);
 when(user.get(eq("password"))).thenReturn("123456");
 when(user.get(eq("u_id"))).thenReturn("654321");

通過真實測試用例測試代碼

Mockito測試需要設置參數和預期返回值,在方法體中遇到的所有未知對象(除了方法體中new的對象不需要)都需要進行模擬,但是在SpringBoot代碼剛剛完成的初期時,跟想模擬真實場景下進行單元測試代碼問題or配置問題,那么通過自動注入的方式引入對象是一種更好的選擇。

ProviderServiceImpl.java   -----服務類
 
import com.alibaba.dubbo.config.annotation.Service;
import com.example.demo.service.DemoService;
@Service
public class ProviderServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) { 
        return "hello " + name + " !";
    }
} 
 
DemoApplicationTests.java  -----測試類
 
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
 
    @Resource
    DemoService providerService;
 
    @Test
    public void contextLoads() {
        String result = providerService.sayHello("Spring Boot Test");
        System.out.println("result is "+result);
       Assert.assertEquals("success","hello Spring Boot Test !" ,result);
    } 
}

這里需要注意的是DemoApplicationTests 需要跟啟動類main在同一級目錄下,如果跟mvc在同一層可以會出現部分bean掃描不到的情況。如目錄層級很深或者程序啟動比較慢的話,可以去掉SpringBootTest(去掉后就不啟動程序,只會運行該測試),運行一下,測試結果如下:

SpringBoot單元測試使用@Test沒有run方法的解決方案是什么

通過這種注解的方式,可以測試dubbo連接(Refernce注解),可以測試controller層,redis數據,mysql數據,都會真實模擬,你只需要在注入你需要測試的類,在類的入口傳入測試參數,在測試過程中,最好采用debug的方式,這樣你可以看到每一步的數據,也便于定位程序的問題(當然也可以出現問題時使用debug)。

springboot是什么

springboot一種全新的編程規范,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程,SpringBoot也是一個服務于框架的框架,服務范圍是簡化配置文件。

看完上述內容,你們掌握SpringBoot單元測試使用@Test沒有run方法的解決方案是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉黎县| 涿州市| 阜城县| 珠海市| 茶陵县| 九龙县| 莱芜市| 盘锦市| 扎兰屯市| 蚌埠市| 涞源县| 洪江市| 浮梁县| 长阳| 平原县| 漯河市| 沧州市| 隆回县| 易门县| 崇礼县| 临邑县| 湄潭县| 西吉县| 莫力| 永登县| 广水市| 正镶白旗| 得荣县| 龙南县| 商都县| 班戈县| 廉江市| 新巴尔虎左旗| 怀来县| 正蓝旗| 波密县| 扶沟县| 乌拉特后旗| 柞水县| 赣州市| 平乐县|