日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

学习 Spring Boot:(二十九)Spring Boot Junit 单元测试

發(fā)布時間:2023/12/9 javascript 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

From: https://blog.wuwii.com/springboot-test.html

前言

JUnit 是一個回歸測試框架,被開發(fā)者用于實施對應用程序的單元測試,加快程序編制速度,同時提高編碼的質量。

JUnit 測試框架具有以下重要特性:

  • 測試工具
  • 測試套件
  • 測試運行器
  • 測試分類

了解 Junit 基礎方法

加入依賴

在 pom.xml 中加入依賴:

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<scope>test</scope>

<version>4.12</version>

</dependency>

創(chuàng)建測試類和測試方法

  • 測試類的的命名規(guī)則一般是 xxxTest.java ;
  • 測試類中測試的方法可以有前綴,這個看統(tǒng)一標準,所以有時候會發(fā)現(xiàn)別人的測試方法上有test前綴;
  • 并且測試方法上加上注解 @Test。
  • 使用 IDEA 中,選中當前類名,使用快捷鍵 ALT + ENTER(WIN),向下選則 Create Test 回車,即可進入生成測試類的選項中,再次回車,就快速的生成測試類。

    OK 完你會發(fā)現(xiàn),生成的測試類在 src/test 目錄下,測試類和源代碼的包名 是一致的。生成后結果(注意下生成的方法名是不加 test):

    public class HelloServiceImplTest {

    @Before

    public void setUp() throws Exception {

    }

    @After

    public void tearDown() throws Exception {

    }

    @Test

    public void say() {

    }

    }

    JUnit中的注解

    • @BeforeClass:針對所有測試,只執(zhí)行一次,且必須為static void
    • @Before:初始化方法,執(zhí)行當前測試類的每個測試方法前執(zhí)行。
    • @Test:測試方法,在這里可以測試期望異常和超時時間
    • @After:釋放資源,執(zhí)行當前測試類的每個測試方法后執(zhí)行
    • @AfterClass:針對所有測試,只執(zhí)行一次,且必須為static void
    • @Ignore:忽略的測試方法(只在測試類的時候生效,單獨執(zhí)行該測試方法無效)
    • @RunWith:可以更改測試運行器 ,缺省值 org.junit.runner.Runner

    一個單元測試類執(zhí)行順序為:

    @BeforeClass –> @Before –> @Test –> @After –> @AfterClass

    每一個測試方法的調用順序為:

    @Before –> @Test –> @After

    超時測試

    如果一個測試用例比起指定的毫秒數(shù)花費了更多的時間,那么 Junit 將自動將它標記為失敗。timeout 參數(shù)和 @Test注釋一起使用。現(xiàn)在讓我們看看活動中的 @test(timeout)。

    @Test(timeout = 1000)

    public void testTimeout() throws InterruptedException {

    TimeUnit.SECONDS.sleep(2);

    System.out.println("Complete");

    }

    上面測試會失敗,在一秒后會拋出異常 org.junit.runners.model.TestTimedOutException: test timed out after 1000 milliseconds

    異常測試

    你可以測試代碼是否它拋出了想要得到的異常。expected 參數(shù)和 @Test 注釋一起使用。現(xiàn)在讓我們看看活動中的 @Test(expected)。

    @Test(expected = NullPointerException.class)

    public void testNullException() {

    throw new NullPointerException();

    }

    上面代碼會測試成功。

    套件測試

    public class TaskOneTest {

    @Test

    public void test() {

    System.out.println("Task one do.");

    }

    }

    public class TaskTwoTest {

    @Test

    public void test() {

    System.out.println("Task two do.");

    }

    }

    public class TaskThreeTest {

    @Test

    public void test() {

    System.out.println("Task Three.");

    }

    }

    @RunWith(Suite.class) // 1. 更改測試運行方式為 Suite

    // 2. 將測試類傳入進來

    @Suite.SuiteClasses({TaskOneTest.class, TaskTwoTest.class, TaskThreeTest.class})

    public class SuitTest {

    /**

    * 測試套件的入口類只是組織測試類一起進行測試,無任何測試方法,

    */

    }

    參數(shù)化測試

    Junit 4 引入了一個新的功能參數(shù)化測試。參數(shù)化測試允許開發(fā)人員使用不同的值反復運行同一個測試。你將遵循 5 個步驟來創(chuàng)建參數(shù)化測試

    • 用 @RunWith(Parameterized.class)來注釋 test 類。
    • 創(chuàng)建一個由 @Parameters 注釋的公共的靜態(tài)方法,它返回一個對象的集合(數(shù)組)來作為測試數(shù)據(jù)集合。
    • 創(chuàng)建一個公共的構造函數(shù),它接受和一行測試數(shù)據(jù)相等同的東西。
    • 為每一列測試數(shù)據(jù)創(chuàng)建一個實例變量。
    • 用實例變量作為測試數(shù)據(jù)的來源來創(chuàng)建你的測試用例。

    //1.更改默認的測試運行器為RunWith(Parameterized.class)

    @RunWith(Parameterized.class)

    public class ParameterTest {

    // 2.聲明變量存放預期值和測試數(shù)據(jù)

    private String firstName;

    private String lastName;

    //3.聲明一個返回值 為Collection的公共靜態(tài)方法,并使用@Parameters進行修飾

    @Parameterized.Parameters //

    public static List<Object[]> param() {

    // 這里我給出兩個測試用例

    return Arrays.asList(new Object[][]{{"Mike", "Black"}, {"Cilcln", "Smith"}});

    }

    //4.為測試類聲明一個帶有參數(shù)的公共構造函數(shù),并在其中為之聲明變量賦值

    public ParameterTest(String firstName, String lastName) {

    this.firstName = firstName;

    this.lastName = lastName;

    }

    // 5. 進行測試,發(fā)現(xiàn)它會將所有的測試用例測試一遍

    @Test

    public void test() {

    String name = firstName + " " + lastName;

    assertThat("Mike Black", is(name));

    }

    }

    Hamcrest

    JUnit 4.4 結合 Hamcrest 提供了一個全新的斷言語法——assertThat。

    語法:

    assertThat( [actual], [matcher expected] );

    assertThat 使用了 Hamcrest 的 Matcher 匹配符,用戶可以使用匹配符規(guī)定的匹配準則精確的指定一些想設定滿足的條件,具有很強的易讀性,而且使用起來更加靈活。

    具體使用的一些匹配規(guī)則可以查看源碼。

    Spring Boot 中使用 JUnit

    Spring 框架提供了一個專門的測試模塊(spring-test),用于應用程序的集成測試。 在 Spring Boot 中,你可以通過spring-boot-starter-test啟動器快速開啟和使用它。

    加入依賴

    <dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-test</artifactId>

    <scope>test</scope>

    </dependency>

    Spring Boot 測試

    // 獲取啟動類,加載配置,確定裝載 Spring 程序的裝載方法,它回去尋找 主配置啟動類(被 @SpringBootApplication 注解的)

    @SpringBootTest

    // 讓 JUnit 運行 Spring 的測試環(huán)境, 獲得 Spring 環(huán)境的上下文的支持

    @RunWith(SpringRunner.class)

    public class EmployeeServiceImplTest {

    // do

    }

    Spring MVC 測試

    當你想對 Spring MVC 控制器編寫單元測試代碼時,可以使用@WebMvcTest注解。它提供了自配置的 MockMvc,可以不需要完整啟動 HTTP 服務器就可以快速測試 MVC 控制器。

  • 需要測試的 Controller:

    • @RestController

      @RequestMapping(value = "/emp", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

      public class EmployeeController {

      private final EmployeeService employeeService;

      @Autowired

      public EmployeeController(EmployeeService employeeService) {

      this.employeeService = employeeService;

      }

      @GetMapping

      public ResponseEntity<List<EmployeeResult>> listAll() {

      return ResponseEntity.ok(employeeService.findEmployee());

      }

      }

    • 編寫 MockMvc 的測試類:

    • @RunWith(SpringRunner.class)

      @WebMvcTest(EmployeeController.class)

      public class EmployeeController2Test {

      @Autowired

      private MockMvc mvc;

      @MockBean

      private EmployeeService employeeService;

      public void setUp() {

      // 數(shù)據(jù)打樁,設置該方法返回的 body一直 是空的

      Mockito.when(employeeService.findEmployee()).thenReturn(new ArrayList<>());

      }

      @Test

      public void listAll() throws Exception {

      mvc.perform(MockMvcRequestBuilders.get("/emp"))

      .andExpect(status().isOk()) // 期待返回狀態(tài)嗎碼200

      // JsonPath expression https://github.com/jayway/JsonPath

      //.andExpect(jsonPath("$[1].name").exists()) // 這里是期待返回值是數(shù)組,并且第二個值的 name 存在,所以這里測試是失敗的

      .andDo(print()); // 打印返回的 http response 信息

      }

      }

      使用@WebMvcTest注解時,只有一部分的 Bean 能夠被掃描得到,它們分別是:

      • @Controller
      • @ControllerAdvice
      • @JsonComponent
      • Filter
      • WebMvcConfigurer
      • HandlerMethodArgumentResolver
        其他常規(guī)的@Component(包括@Service、@Repository等)Bean 則不會被加載到 Spring 測試環(huán)境上下文中。
        所以我在上面使用了數(shù)據(jù)打樁,Mockito 在這篇文章最后一節(jié)。
    • 我們也可以注入Spring 上下文的環(huán)境到 MockMvc 中,如下編寫 MockMvc 的測試類:

  • @RunWith(SpringRunner.class)

    @SpringBootTest

    public class EmployeeControllerTest {

    /**

    * Interface to provide configuration for a web application.

    */

    @Autowired

    private WebApplicationContext ctx;

    private MockMvc mockMvc;

    /**

    * 初始化 MVC 的環(huán)境

    */

    @Before

    public void before() {

    mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();

    }

    @Test

    public void listAll() throws Exception {

    mockMvc

    .perform(get("/emp") // 測試的相對地址

    .accept(MediaType.APPLICATION_JSON_UTF8) // accept response content type

    )

    .andExpect(status().isOk()) // 期待返回狀態(tài)嗎碼200

    // JsonPath expression https://github.com/jayway/JsonPath

    .andExpect(jsonPath("$[1].name").exists()) // 這里是期待返回值是數(shù)組,并且第二個值的 name 存在

    .andDo(print()); // 打印返回的 http response 信息

    }

    }

    值得注意的是需要首先使用 WebApplicationContext 構建 MockMvc。

  • Spring Boot Web 測試

    當你想啟動一個完整的 HTTP 服務器對 Spring Boot 的 Web 應用編寫測試代碼時,可以使用@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)注解開啟一個隨機的可用端口。Spring Boot 針對 REST 調用的測試提供了一個 TestRestTemplate 模板,它可以解析鏈接服務器的相對地址。

    @RunWith(SpringRunner.class)

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

    public class EmployeeController1Test {

    @Autowired

    private TestRestTemplate restTemplate;

    @Test

    public void listAll() {

    ResponseEntity<List> result = restTemplate.getForEntity("/emp", List.class);

    Assert.assertThat(result.getBody(), Matchers.notNullValue());

    }

    }

    其實之前上面的測試返回結果不是很正確,只能接收個List,給測試代碼添加了不少麻煩,還好最終找到了解決辦法:

    @Test

    public void listAll() {

    // 由于我返回的是 List 類型的,一直想不到辦法解決,網(wǎng)上給出了解決辦法,使用 exchange 函數(shù)代替

    //public <T> ResponseEntity<T> exchange(String url, HttpMethod method,

    // HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType,

    // Object... urlVariables) throws RestClientException {

    ParameterizedTypeReference<List<EmployeeResult>> type = new ParameterizedTypeReference<List<EmployeeResult>>() {};

    ResponseEntity<List<EmployeeResult>> result = restTemplate.exchange("/emp", HttpMethod.GET, null, type);

    Assert.assertThat(result.getBody().get(0).getName(), Matchers.notNullValue());

    }

    Spring Data JPA 測試

    我們可以使用 @DataJpaTest注解表示只對 JPA 測試;@DataJpaTest注解它只掃描@EntityBean 和裝配 Spring Data JPA 存儲庫,其他常規(guī)的@Component(包括@Service、@Repository等)Bean 則不會被加載到 Spring 測試環(huán)境上下文。

    @DataJpaTest 還提供兩種測試方式:

  • 使用內存數(shù)據(jù)庫 h2database,Spring Data Jpa 測試默認采取的是這種方式;
  • 使用真實環(huán)境的數(shù)據(jù)庫。
  • 使用內存數(shù)據(jù)庫測試

  • 默認情況下,@DataJpaTest使用的是內存數(shù)據(jù)庫進行測試,你無需配置和啟用真實的數(shù)據(jù)庫。只需要在 pom.xml 配置文件中聲明如下依賴即可:

  • <dependency>

    <groupId>com.h2database</groupId>

    <artifactId>h2</artifactId>

    </dependency>

    gradle file:

    • testCompile('com.h2database:h2')

    • 編寫測試方法:

  • @RunWith(SpringRunner.class)

    @DataJpaTest

    public class EmployeeDaoTest {

    @Autowired

    private EmployeeDao employeeDao;

    @Test

    public void testSave() {

    Employee employee = new Employee();

    EmployeeDetail detail = new EmployeeDetail();

    detail.setName("kronchan");

    detail.setAge(24);

    employee.setDetail(detail);

    assertThat(detail.getName(), Matchers.is(employeeDao.save(employee).getDetail().getName()));;

    }

    }

  • 使用真實數(shù)據(jù)庫測試

    如要需要使用真實環(huán)境中的數(shù)據(jù)庫進行測試,需要替換掉默認規(guī)則,使用@AutoConfigureTestDatabase(replace = Replace.NONE)注解:

    @RunWith(SpringRunner.class)

    @DataJpaTest

    // 加入 AutoConfigureTestDatabase 注解

    @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

    public class EmployeeDaoTest {

    @Autowired

    private EmployeeDao employeeDao;

    @Test

    public void testSave() {

    Employee employee = new Employee();

    EmployeeDetail detail = new EmployeeDetail();

    detail.setName("kronchan");

    detail.setAge(24);

    employee.setDetail(detail);

    assertThat(detail.getName(), Matchers.is(employeeDao.save(employee).getDetail().getName()));;

    }

    }

    事務控制

    執(zhí)行上面的新增數(shù)據(jù)的測試,發(fā)現(xiàn)測試通過,但是數(shù)據(jù)庫卻并沒有新增數(shù)據(jù)。默認情況下,在每個 JPA 測試結束時,事務會發(fā)生回滾。這在一定程度上可以防止測試數(shù)據(jù)污染數(shù)據(jù)庫。

    如果你不希望事務發(fā)生回滾,你可以使用@Rollback(false)注解,該注解可以標注在類級別做全局的控制,也可以標注在某個特定不需要執(zhí)行事務回滾的方法級別上。

    也可以顯式的使用注解 @Transactional 設置事務和事務的控制級別,放大事務的范圍。

    Mockito

    這部分參考 使用Mockito和SpringTest進行單元測試

    JUnit和SpringTest,基本上可以滿足絕大多數(shù)的單元測試了,但是,由于現(xiàn)在的系統(tǒng)越來越復雜,相互之間的依賴越來越多。特別是微服務化以后的系統(tǒng),往往一個模塊的代碼需要依賴幾個其他模塊的東西。因此,在做單元測試的時候,往往很難構造出需要的依賴。一個單元測試,我們只關心一個小的功能,但是為了這個小的功能能跑起來,可能需要依賴一堆其他的東西,這就導致了單元測試無法進行。所以,我們就需要再測試過程中引入Mock測試。

    所謂的Mock測試就是在測試過程中,對于一些不容易構造的、或者和這次單元測試無關但是上下文又有依賴的對象,用一個虛擬的對象(Mock對象)來模擬,以便單元測試能夠進行。

    比如有一段代碼的依賴為:

    當我們要進行單元測試的時候,就需要給A注入B和C,但是C又依賴了D,D又依賴了E。這就導致了,A的單元測試很難得進行。
    但是,當我們使用了Mock來進行模擬對象后,我們就可以把這種依賴解耦,只關心A本身的測試,它所依賴的B和C,全部使用Mock出來的對象,并且給MockB和MockC指定一個明確的行為。就像這樣:

    因此,當我們使用Mock后,對于那些難以構建的對象,就變成了個模擬對象,只需要提前的做Stubbing(樁)即可,所謂做樁數(shù)據(jù),也就是告訴Mock對象,當與之交互時執(zhí)行何種行為過程。比如當調用B對象的b()方法時,我們期望返回一個true,這就是一個設置樁數(shù)據(jù)的預期。

    基礎

    Mockito 簡明教程

    Spring Boot 中使用

    上面的 Spring MVC 測試 中也使用到了 Mockito,

    spring-boot-starter-test 自帶了 mockito-core。

    基礎業(yè)務

    @Entity

    @Data

    @NoArgsConstructor

    public class User implements Serializable {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private Long id;

    @Column(unique = true, nullable = false, length = 50)

    private String username;

    private String password;

    @CreationTimestamp

    private Date createDate;

    public User(Long id, String username) {

    this.id = id;

    this.username = username;

    }

    }

    public interface IUserRepository extends JpaRepository<User, Long> {

    boolean updateUser(User user);

    }

    @Service

    @RequiredArgsConstructor(onConstructor = @__(@Autowired))

    public class UserServiceImpl implements IUserService {

    private final IUserRepository userRepository;

    @Override

    public User findOne(Long id) {

    return userRepository.getOne(id);

    }

    @Override

    public boolean updateUsername(Long id, String username) {

    User user = findOne(id);

    if (user == null) {

    return false;

    }

    user.setUsername(username);

    return userRepository.updateUser(user);

    }

    }

    測試類

    public class IUserServiceTest {

    private IUserService userService;

    //@Mock

    private IUserRepository userRepository;

    @Before

    public void setUp() throws Exception {

    // 對所有注解了@Mock的對象進行模擬

    // MockitoAnnotations.initMocks(this);

    // 不使用注解,可以對單個對象進行 mock

    userRepository = Mockito.mock(IUserRepository.class);

    // 構造被測試對象

    userService = new UserServiceImpl(userRepository);

    // 打樁,構建當 userRepository的 getOne 函數(shù)執(zhí)行參數(shù)為 1的時候,設置返回的結果 User

    Mockito.when(userRepository.getOne(1L)).thenReturn(new User(1L, "kronchan"));

    // 打樁,構建當 userRepository的 getOne 函數(shù)執(zhí)行參數(shù)為 2的時候,設置返回的結果 null

    Mockito.when(userRepository.getOne(2L)).thenReturn(null);

    // 打樁,構建當 userRepository的 getOne 函數(shù)執(zhí)行參數(shù)為 3的時候,設置結果拋出異常

    Mockito.when(userRepository.getOne(3L)).thenThrow(new IllegalArgumentException("The id is not support"));

    // 打樁,當 userRepository.updateUser 執(zhí)行任何User類型的參數(shù),返回的結果都是true

    Mockito.when(userRepository.updateUser(Mockito.any(User.class))).thenReturn(true);

    }

    @Test

    public void testUpdateUsernameSuccess() {

    long userId = 1L;

    String newUsername = "new kronchan";

    // 測試某個 service 的方法

    boolean updated = userService.updateUsername(userId, newUsername);

    // 檢查結果

    Assert.assertThat(updated, Matchers.is(true));

    // Verifies certain behavior <b>happened once</b>.

    // mock對象一旦創(chuàng)建,就會自動記錄自己的交互行為。通過verify(mock).someMethod()方法,來驗證方法是否被調用。

    // 驗證調用上面的service 方法后是否 userRepository.getOne(1L) 調用過,

    Mockito.verify(userRepository).getOne(userId);

    // 有條件可以測試下沒有被調用過的方法:

    // Mockito.verify(userRepository).deleteById(userId);

    // 則會測試失敗:

    // Wanted but not invoked:

    // userRepository.deleteById(1L);

    // However, there were exactly 2 interactions with this mock:

    // userRepository.getOne(1L);

    // userRepository.updateUser(

    // User(id=1, username=new kronchan, password=null, createDate=null)

    // );

    // updateUsername 函數(shù)中我們調用了已經(jīng)打樁了的其他的函數(shù),現(xiàn)在我們來驗證進入其他函數(shù)中的參數(shù)

    //構造參數(shù)捕獲器,用于捕獲方法參數(shù)進行驗證

    ArgumentCaptor<User> userCaptor = ArgumentCaptor.forClass(User.class);

    // 驗證updateUser方法是否被調用過,并且捕獲入?yún)?/p>

    Mockito.verify(userRepository).updateUser(userCaptor.capture());

    // 獲取參數(shù) updatedUser

    User updatedUser = userCaptor.getValue();

    // 驗證入?yún)⑹欠袷穷A期的

    Assert.assertThat(updatedUser.getUsername(), Matchers.is(newUsername));

    //保證這個測試用例中所有被Mock的對象的相關方法都已經(jīng)被Verify過了

    Mockito.verifyNoMoreInteractions(userRepository);

    // 如果有一個交互,但是我們沒有verify ,則會報錯,

    // org.mockito.exceptions.verification.NoInteractionsWanted:

    // No interactions wanted here:

    // -> at com.wuwii.service.IUserServiceTest.testUpdateUsernameSuccess(IUserServiceTest.java:74)

    // But found this interaction on mock 'iUserRepository':

    // -> at com.wuwii.service.impl.UserServiceImpl.findOne(UserServiceImpl.java:21)

    // ***

    }

    @Test

    public void testUpdateUsernameFailed() {

    long userId = 2L;

    String newUsername = "new kronchan";

    // 沒有經(jīng)過 mock 的 updateUser 方法,它返回的是 false

    boolean updated = userService.updateUsername(userId, newUsername);

    Assert.assertThat(updated, Matchers.not(true));

    //驗證userRepository的getOne(2L)這個方法是否被調用過,(這個是被測試過的,此步驟通過)

    Mockito.verify(userRepository).getOne(2L);

    // 驗證 userRepository 的 updateUser(null)這個方法是否被調用過,(這個沒有被測試過,此步驟不通過)

    //Mockito.verify(userRepository).updateUser(null);

    Mockito.verifyNoMoreInteractions(userRepository);

    }

    }

    分析

    創(chuàng)建MOCK的對象

    我需要對 userService 進行測定,就需要模擬 userRepository 對象。

    我在 setUp() 方法中,模擬對象并打樁。

    模擬對象有兩種方式:

  • 對注解了@Mock的對象進行模擬 MockitoAnnotations.initMocks(this);
  • 對單個對象手動 mock :userRepository = Mockito.mock(IUserRepository.class);
  • 數(shù)據(jù)打樁,除了上面我代碼上用的幾個方法,還有非常多的方法,具體可以在使用的時候看到,主要分下面幾種:

  • 最基本的用法就是調用 when以及thenReturn方法了。他們的作用就是指定當我們調用被代理的對象的某一個方法以及參數(shù)的時候,返回什么值。

  • 提供參數(shù)匹配器,靈活匹配參數(shù)。any()、any(Class<T> type)、anyBoolean()、anyByte()、anyChar()、anyInt()、anyLong()等等,它支持復雜的過濾,可以使用正則 Mockito.matches(".*User$")),開頭結尾驗證endsWith(String suffix),startsWith(String prefix)、判空驗證isNotNull() isNull()
    也還可以使用 argThat(ArgumentMatchermatcher),如:ArgumentMatcher只有一個方法boolean matches(T argument);傳入入?yún)?#xff0c;返回一個boolean表示是否匹配。

    Mockito.argThat(argument -> argument.getUsername.length() > 6;

  • Mockito還提供了兩個表示行為的方法:thenAnswer(Answer<?> answer);、thenCallRealMethod();,分別表示自定義處理調用后的行為,以及調用真實的方法。這兩個方法在有些測試用例中還是很有用的。

  • 對于同一個方法,Mockito可以是順序與次數(shù)關心的。也就是說可以實現(xiàn)同一個方法,第一次調用返回一個值,第二次調用返回一個值,甚至第三次調用拋出異常等等。只需要連續(xù)的調用thenXXXX即可。

  • 如果為一個返回為Void的方法設置樁數(shù)據(jù)。上面的方法都是表示的是有返回值的方法,而由于一個方法沒有返回值,因此我們不能調用when方法(編譯器不允許)。因此,對于無返回值的方法,Mockito提供了一些列的doXXXXX方法,比如:doAnswer(Answer answer)、doNothing()、doReturn(Object toBeReturned)、doThrow(Class<? extends Throwable> toBeThrown)、doCallRealMethod()。他們的使用方法其實和上面的thenXXXX是一樣的,但是when方法傳入的是Mock的對象:

  • /*對void的方法設置模擬*/

    Mockito.doAnswer(invocationOnMock -> {

    System.out.println("進入了Mock");

    return null;

    }).when(fileRecordDao).insert(Mockito.any());

    當 Mockito 監(jiān)視一個真實的對象的時候,我們也可以模擬這個對象的方法返回我們設置的期望值,

  • List spy = spy(new LinkedList());

    List spy = spy(new LinkedList());

    // IndexOutOfBoundsException (the list is yet empty)

    when(spy.get(0)).thenReturn("foo");

    // You have to use doReturn() for stubbing

    doReturn("foo").when(spy).get(0);

    when方法參數(shù)中spy.get(0),調用的是真實list對象的get(0),這會產生 IndexOutOfBoundsException異常,所以這時需要用到 doReturn 方法來設置返回值。

  • 驗證測試方法的結果

    使用斷言語句檢查結果。

    驗證MOCK對象的調用

    其實,在這里我們如果只是驗證方法結果的正確的話,就非常簡單,但是,在復雜的方法調用堆棧中,往往可能出現(xiàn)結果正確,但是過程不正確的情況。比如,updateUserName方法返回false是有兩種可能的,一種可能是用戶沒有找到,還有一種可能就是userRepository.updateUser(userPO)返回false。因此,如果我們只是使用Assert.assertFalse(updated);來驗證結果,可能就會忽略某些錯誤。

  • 因此我在上面的測試中還需要驗證指定的方法 userRepository).getOne(userId);是否運行過,而且我還使用了參數(shù)捕獲器,抓取中間的方法參數(shù),用來驗證。

  • 提供了verify(T mock, VerificationMode mode)方法。VerificationMode 有很多作用,

    • // 驗證指定方法 get(3) 沒有被調用

      verify(mock, never()).get(3);

    • verifyZeroInteractions和verifyNoMoreInteractions 驗證所有 mock 的方法是否都調用過了。

    總結

    以上是生活随笔為你收集整理的学习 Spring Boot:(二十九)Spring Boot Junit 单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    激情久久久久久久久久久久久久久久 | 国产精品理论在线观看 | 97人人人人 | 久久久久久亚洲精品 | 在线免费黄色av | 99这里都是精品 | 久久精品国产一区二区三区 | 激情网五月| 日韩精品久久久久久久电影竹菊 | av一区二区在线观看中文字幕 | 国产精品乱码久久 | 青青五月天| 日韩高清久久 | 日日爱夜夜爱 | 丁香激情综合久久伊人久久 | 精品久久在线 | 中文字幕在线观看完整版 | 又黄又爽的免费高潮视频 | 日韩免费视频观看 | 一级性av | 日本少妇高清做爰视频 | 五月婷婷丁香 | 欧美最猛性xxxx | 中文字幕在线观看第一区 | 精品久久九九 | 国产麻豆剧传媒免费观看 | 婷婷伊人网 | 丁香资源影视免费观看 | 人人网人人爽 | 日韩欧美一区二区三区免费观看 | 国产日韩在线播放 | 国产二区电影 | 色综合久久88色综合天天免费 | 亚洲最新在线 | 麻豆91精品91久久久 | 精品国产一二三四区 | 日韩综合视频在线观看 | 欧美精品国产综合久久 | 天天操天天干天天综合网 | 亚洲精品国产综合99久久夜夜嗨 | av免费网站观看 | 黄色免费观看网址 | 99在线精品免费视频九九视 | 麻豆视屏| 免费av黄色| 中文字幕在线看片 | 日日摸日日添夜夜爽97 | 日韩久久精品一区二区 | 国产婷婷 | 国产丝袜美腿在线 | zzijzzij日本成熟少妇 | 一本一本久久a久久精品牛牛影视 | 日韩欧美视频二区 | 久久短视频 | 在线播放日韩av | 国产精品国产三级国产aⅴ无密码 | 亚洲高清av在线 | 日韩欧美在线观看一区二区 | 亚洲精品麻豆 | 亚洲国产精品久久久久婷婷884 | 日韩免费精品 | 国产精品综合久久久久久 | 久久久久久久久久久免费 | 国产精品视频地址 | 狠狠色丁香| 日韩久久精品 | 成人在线观看资源 | www.久草视频 | 国产精品一区久久久久 | 最近更新中文字幕 | 91精品小视频 | 中文字幕日韩有码 | 国产精品字幕 | 欧美日在线观看 | 国产高清久久久久 | 69亚洲精品 | 亚洲精品久久久蜜臀下载官网 | 色妞色视频一区二区三区四区 | 婷婷丁香激情五月 | a黄色影院 | 精品一区在线看 | 久久久久久久久久国产精品 | 欧美日韩视频在线一区 | 人人干97| 亚洲1级片| 激情欧美xxxx| 久久免费高清视频 | 成人在线播放视频 | 九九视频网 | 国产精品免费看久久久8精臀av | 国内少妇自拍视频一区 | 麻豆一精品传二传媒短视频 | 首页国产精品 | 中文字幕在线国产精品 | 最新动作电影 | 不卡的av在线| 国产精品精品国产婷婷这里av | 欧美日韩三级在线观看 | av在线免费播放 | 日韩二三区 | 粉嫩av一区二区三区四区五区 | 精品久久久久久久久久久久 | 在线精品一区二区 | 日本爱爱免费视频 | 中文字幕亚洲欧美日韩2019 | 亚洲午夜精品久久久 | 天天狠狠干 | 久草在线免费新视频 | 久久怡红院 | 国产精品videoxxxx | 99久久精品免费看国产免费软件 | 我爱av激情网 | 久久精品国产亚洲精品 | 亚洲国产av精品毛片鲁大师 | 婷婷色中文字幕 | 国产一区二区三区高清播放 | 日本精品在线看 | 福利视频导航网址 | 日韩视频在线不卡 | 久久久久免费网 | 天天爽综合网 | 日本中文在线播放 | 婷婷六月激情 | 免费在线观看成人小视频 | 2023年中文无字幕文字 | 996久久国产精品线观看 | 久草资源在线 | 色综合在| 欧美日韩一区二区三区在线观看视频 | 天天操夜夜干 | 亚洲精品久久久蜜桃 | 五月激情婷婷丁香 | 美女视频黄是免费的 | av免费在线网 | 亚洲综合黄色 | 久久艹久久 | 国产区精品 | 999久久久免费精品国产 | 欧美在线视频不卡 | 在线免费观看国产黄色 | 免费视频一二三 | 岛国一区在线 | 韩国视频一区二区三区 | 高清av影院 | 91av视频在线免费观看 | 一区二区欧美在线观看 | 国产精品日韩欧美一区二区 | 日本精品一 | 五月婷婷综合在线视频 | 国产精品免费大片视频 | 中文字幕二区在线观看 | 这里有精品在线视频 | 激情综合五月婷婷 | 成人丝袜 | 黄色三级在线看 | 九九热免费精品视频 | 国产一级精品视频 | 日韩丝袜 | 综合色站导航 | 日本中文字幕在线观看 | 色夜视频 | 在线观看久草 | 亚洲免费国产视频 | av黄色av | 亚洲五月婷 | 丝袜+亚洲+另类+欧美+变态 | 久久这里只有精品视频99 | 国产正在播放 | 97视频在线观看免费 | 国产精品99久久免费黑人 | 欧美亚洲另类在线视频 | 国产又粗又猛又色又黄视频 | 日日夜夜人人精品 | 国产黄色免费看 | 夜夜操网站 | 午夜视频在线观看网站 | 天天在线免费视频 | 免费在线一区二区 | 亚洲在线a | 97精品久久人人爽人人爽 | 久久久久 免费视频 | 成人久久久久久久久久 | 99热这里| 成人午夜电影在线观看 | www麻豆视频| 日韩欧美xxxx | 在线观看国产成人av片 | 伊香蕉大综综综合久久啪 | 久久免费试看 | 91丨九色丨勾搭 | 久久久18| av在线收看 | 日韩小视频网站 | 看毛片网站| 久久久国产一区二区三区四区小说 | 中文字幕在线免费播放 | 最新中文字幕 | 天堂网av 在线 | 伊人婷婷网 | 成人av电影在线 | 日韩手机视频 | 国产精品3 | 国产精品久久久久影视 | 日韩av电影网站在线观看 | 99av国产精品欲麻豆 | 日韩专区一区二区 | 欧美日韩亚洲在线观看 | 国产69精品久久久久久 | 亚洲伦理中文字幕 | 91视频 - 114av | 精品国产一区二区三区久久久蜜月 | 91人人插| 免费看麻豆 | 99在线热播精品免费99热 | 欧美午夜精品久久久久久浪潮 | 国产日产高清dvd碟片 | 日韩免费福利 | 欧美孕妇与黑人孕交 | 国产精品 日韩精品 | 天天干.com| 五月天久久久久久 | 国产精品免费观看在线 | 欧美日韩精品在线观看视频 | 免费观看不卡av | 91日韩在线播放 | 九九热在线视频免费观看 | 亚洲免费观看在线视频 | 色橹橹欧美在线观看视频高清 | 天天视频色版 | 国产美女免费观看 | 国产婷婷视频在线 | 亚洲午夜久久久久久久久电影网 | 国内精品久久久久 | 手机av网站 | 热re99久久精品国产99热 | 国产福利91精品一区二区三区 | 久久99久久99精品 | 999久久久免费视频 午夜国产在线观看 | 免费av网站在线看 | 国产精品99免视看9 国产精品毛片一区视频 | 九九热在线观看视频 | 久久乐九色婷婷综合色狠狠182 | 日韩激情影院 | 日韩一区在线播放 | 国产精品一区久久久久 | 97碰在线 | 欧美国产大片 | 欧美综合在线观看 | 久草精品视频在线播放 | 日韩在线视频在线观看 | 久久久久久久久久亚洲精品 | 五月天激情视频 | 色综合久久久网 | 麻豆国产精品永久免费视频 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国产中文伊人 | 国产 成人 久久 | 天天操天天爽天天干 | 日韩字幕 | 亚洲乱码一区 | 欧美调教网站 | 久久看片网 | 午夜.dj高清免费观看视频 | 99热九九这里只有精品10 | 欧美一级大片在线观看 | 国产偷v国产偷∨精品视频 在线草 | 免费看色网站 | 久久精品国产亚洲精品2020 | av日韩av| 高清国产在线一区 | 中文字幕亚洲高清 | 久久久免费毛片 | 国产黄色美女 | 伊人午夜视频 | 色综合五月天 | 亚洲成人精品久久 | 涩涩爱夜夜爱 | 国产手机精品视频 | 中文字幕在线乱 | 手机在线中文字幕 | 久久国产免 | 97超碰站| 国产成人a v电影 | 天天综合色天天综合 | 毛片一级免费一级 | 综合黄色网| 欧美精品资源 | 激情电影影院 | 天天摸天天操天天爽 | 手机在线永久免费观看av片 | 玖玖在线精品 | 四虎永久视频 | 91精品一区在线观看 | 91黄色免费看| 亚洲午夜久久久综合37日本 | 国产乱对白刺激视频不卡 | 五月婷婷丁香激情 | 中文字幕免费高清在线观看 | av官网在线 | 色偷偷网站视频 | 欧美久久久久久久久 | 国产精品女教师 | 天天天色综合 | 9999精品免费视频 | 天天天天综合 | 久久免费视频这里只有精品 | 中文字幕 在线 一 二 | 在线观看免费高清视频大全追剧 | 精品亚洲欧美无人区乱码 | 亚洲作爱视频 | av国产网站 | 欧美午夜精品久久久久久孕妇 | 波多在线视频 | 亚洲成人精品 | av不卡免费在线观看 | 激情婷婷在线观看 | 国产精品一码二码三码在线 | 91免费看黄色 | 国产成人三级在线观看 | 久草免费福利在线观看 | 亚洲毛片一区二区三区 | 麻豆播放 | 久久99国产精品久久99 | 免费亚洲黄色 | a级片韩国| 国产91免费在线 | 国产一区自拍视频 | 亚洲精品日韩av | 久久久久久精 | 久久亚洲影视 | 在线精品在线 | 精品久久久久久久久久久久 | 欧洲精品二区 | 免费观看成年人视频 | 欧美性色黄 | 成人一区在线观看 | 欧洲成人免费 | 午夜精品久久久久99热app | 亚洲视频精品 | 日韩黄色在线观看 | 中文字幕一区二区三区四区在线视频 | 黄色免费网战 | 日韩欧美在线一区二区 | 国产精品欧美一区二区三区不卡 | 亚洲性视频| 国产最顶级的黄色片在线免费观看 | 色亚洲激情 | 黄色免费视频在线观看 | 97成人在线观看 | 欧美综合在线观看 | 午夜精品久久久久久久久久久久 | 免费看的黄色网 | 日韩免费成人av | 中文字幕一区二区三 | 成人免费视频a | 国产成人久久久77777 | 免费黄色网址大全 | 国产中文字幕在线观看 | 久久综合色一综合色88 | 99精品视频免费在线观看 | 极品国产91在线网站 | 亚洲精品小视频在线观看 | 狠狠综合久久 | 探花视频在线观看+在线播放 | 天天久久夜夜 | 色婷婷激情电影 | va视频在线观看 | 国产香蕉97碰碰久久人人 | 波多野结衣在线播放一区 | av亚洲产国偷v产偷v自拍小说 | 久久男女视频 | 精品视频免费久久久看 | 国产精品国产三级国产aⅴ9色 | 免费大片黄在线 | 天天操欧美 | 国产视频日本 | 久久久久亚洲精品中文字幕 | 97看片网| 色婷婷综合久久久中文字幕 | 成人免费在线播放视频 | 区一区二在线 | 深夜福利视频在线观看 | 日日夜夜天天综合 | 中文字幕在线观看第一区 | 日韩视频一区二区在线 | 五月婷婷国产 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产精品久久久免费 | 日韩有码网站 | 一区二区视频在线看 | 欧美激情视频一二三区 | 人人爱夜夜操 | 成人黄色av免费在线观看 | 999视频在线播放 | 国产亚洲观看 | 少妇bbb好爽 | 久久亚洲精品国产亚洲老地址 | 欧美人牲 | 99国内精品 | .精品久久久麻豆国产精品 亚洲va欧美 | 国产精品久久毛片 | av大全免费在线观看 | 久久6精品| 欧美一区在线观看视频 | 国产一区二区三区高清播放 | 美女网站一区 | 欧美怡红院视频 | 草免费视频 | 麻豆成人网 | 日韩欧美极品 | 91九色视频 | 激情视频二区 | 欧美日韩调教 | 欧美日韩国产精品一区二区 | 国产短视频在线播放 | 日韩系列在线观看 | 日韩理论在线 | 国产精品久久久久久高潮 | 日韩av电影手机在线观看 | av日韩在线网站 | 狠狠色香婷婷久久亚洲精品 | 一级做a视频 | 国产亚洲精品成人av久久ww | 中文字幕久久精品 | 97国产精品视频 | 在线不卡视频 | 91视频在线免费观看 | 成人性生交大片免费观看网站 | 97电影手机版| 91久久爱热色涩涩 | 美女免费黄视频网站 | 91av电影在线观看 | 中文字幕精品www乱入免费视频 | 五月天天色 | 欧美精彩视频在线观看 | 日韩国产欧美在线播放 | 手机看片国产 | 国产精品理论在线观看 | 在线观看亚洲成人 | 久久资源总站 | 欧美一区二区在线免费观看 | 黄色小说在线观看视频 | 亚洲精品在线观看的 | 夜夜视频欧洲 | 六月丁香激情综合 | av网站在线免费观看 | 亚洲视频1区2区 | av五月婷婷| 亚洲精品美女免费 | 天天干天天干天天 | 婷婷在线免费视频 | 一区二区三区视频网站 | 国产精品21区| 日韩有码在线播放 | 久久99久久99精品免视看婷婷 | 午夜久久久精品 | 96看片| 日韩网站免费观看 | 亚洲视频2| 国产精品av免费在线观看 | 91av在线免费视频 | 国产91精品久久久久久 | 欧美黄色成人 | 久久久九色精品国产一区二区三区 | 97视频人人澡人人爽 | 国产成人精品久久久久蜜臀 | 不卡国产视频 | 五月婷在线| 一级成人免费视频 | 国产精品第72页 | av+在线播放在线播放 | 欧美成年网站 | 免费看成人片 | 久草在线免费色站 | 日韩综合第一页 | 91在线免费视频 | 狠狠狠色丁香婷婷综合久久88 | 日韩.com| 日本三级中文字幕在线观看 | 成人av免费 | 狠狠干干 | 国产精品入口66mio女同 | 国产999精品久久久久久 | 国产精品日韩久久久久 | www.看片网站| 激情综合站 | 久草在线免费电影 | 亚洲精品视频在线观看免费视频 | 国产乱老熟视频网88av | 中文字幕欧美日韩va免费视频 | 久久久黄色 | 国产精品精品久久久久久 | 亚洲一区二区天堂 | 精品嫩模福利一区二区蜜臀 | 丝袜av网站 | 99久久综合国产精品二区 | 色综合天天干 | 中文字幕丝袜美腿 | 国产黄色a | 久久久久人人 | 久久免费黄色大片 | 黄色软件在线观看免费 | 久久中文精品视频 | av色综合| 日韩精品中文字幕在线不卡尤物 | 91视频下载| zzijzzij日本成熟少妇 | 欧美日韩高清一区二区 国产亚洲免费看 | 日韩69视频 | 国产精品黄色在线观看 | 91精品看片| 91免费在线视频 | 99免费在线视频观看 | 欧美日韩高清一区 | 亚洲va韩国va欧美va精四季 | 一区二区三区电影在线播 | 四虎国产| 91中文字幕在线播放 | 中文字幕精品视频 | 国产精品成人av电影 | 成人超碰97 | 啪一啪在线 | 人人干人人干人人干 | 亚洲国产wwwccc36天堂 | 国产特级毛片aaaaaaa高清 | av线上看 | 四虎视频 | 欧美日韩国产一区二区三区在线观看 | 国产黄色精品视频 | 亚洲色视频| 高清不卡一区二区在线 | 一区二区三区电影在线播 | 日韩资源在线播放 | 在线免费看黄网站 | 日韩欧美一区二区在线 | 色欧美视频 | 亚洲综合爱 | 丝袜美腿av | 中文字幕在线观看免费观看 | 中文字幕久久久精品 | 一区二区三区免费网站 | 中国一级片在线播放 | 伊人天天操 | 美女黄频在线观看 | 日韩美在线观看 | 日韩在线字幕 | 久色小说 | 顶级bbw搡bbbb搡bbbb| 91大神免费在线观看 | 日韩在线观看精品 | 国产精品免费一区二区三区在线观看 | 99久久综合狠狠综合久久 | 精品久久视频 | 中文免费观看 | 97在线精品| 狠狠狠色 | 欧美一级爽| 精品视频在线观看 | 黄色成人av | 超碰av在线 | 精品国产大片 | 欧美极度另类 | 亚洲年轻女教师毛茸茸 | 夜添久久精品亚洲国产精品 | 久久久久综合精品福利啪啪 | 97成人资源 | 国产乱老熟视频网88av | 婷婷色社区 | 最新av中文字幕 | 久精品视频 | av免费电影网站 | 三级黄色片在线观看 | 九九九视频精品 | 亚洲区视频在线 | 99精品免费久久久久久久久日本 | 国产a免费| 国产精品一区二区免费看 | 91精品国产99久久久久久久 | 久久综合偷偷噜噜噜色 | 精品国产_亚洲人成在线 | av综合站 | 正在播放国产91 | 久久免费精品国产 | 91精品国产九九九久久久亚洲 | 黄色软件网站在线观看 | 不卡的av中文字幕 | 天天干,天天操,天天射 | 在线观看黄色免费视频 | 国产精品18久久久久白浆 | 日韩国产精品一区 | 婷婷综合在线 | 免费看的黄色 | 麻豆视频国产 | 不卡视频在线 | 国产在线精品一区二区 | 91久久黄色 | 国产对白av | 国产一级久久久 | 亚洲精品白浆高清久久久久久 | 亚洲综合色婷婷 | 亚洲美女在线国产 | 国产精品自产拍在线观看中文 | 91精品免费看 | 福利视频一区二区 | 在线国产福利 | 深夜免费福利在线 | 手机av片| 99久久精品久久久久久清纯 | 国产美女精品 | 六月激情婷婷 | 综合网中文字幕 | 日韩午夜在线播放 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 久久av免费| 免费亚洲一区二区 | 美女视频国产 | 播五月综合 | 涩涩网站免费 | 天天曰夜夜操 | 亚洲精品国产精品国自产 | 91精品导航 | 久久av一区二区三区亚洲 | 97成人精品区在线播放 | 国产精品久久久久久久久久久不卡 | 日韩综合在线观看 | 五月激情久久久 | 国产品久精国精产拍 | 免费一级片在线 | 91福利视频久久久久 | 九九热99视频 | 99国产精品免费网站 | 日韩 在线a| 一区二区三区高清在线 | 99久久婷婷 | 欧美精品三级在线观看 | 二区在线播放 | 久章操 | 亚洲免费公开视频 | 国产96视频 | 日韩小视频 | 国产在线观看你懂得 | 99精品视频在线免费观看 | 亚洲综合五月 | 999国内精品永久免费视频 | 久久伊人精品天天 | 在线免费中文字幕 | 亚洲日韩欧美视频 | 丁香高清视频在线看看 | 99免费看片 | 午夜三级大片 | 中文字幕在线观看完整版 | 中文字幕一区2区3区 | 亚洲精品在 | 国产精品久久婷婷六月丁香 | 特级免费毛片 | 日韩综合一区二区三区 | 日本三级久久 | 国产专区在线看 | 黄色aaa毛片| 国产福利不卡视频 | 亚洲国产中文字幕 | 一区 在线 影院 | 久久久视屏| 国产精品欧美 | 国产精品ⅴa有声小说 | 久久免费国产 | 91豆花在线观看 | 色婷婷综合久久久久中文字幕1 | 亚洲精品久久久久中文字幕二区 | 日韩午夜电影 | 在线视频国产区 | 中文字幕乱视频 | 精品国产电影一区 | 人人澡人人干 | 国产精品成人国产乱一区 | 久久久精品国产免费观看同学 | 超碰免费av| 色无五月| 在线观看视频一区二区三区 | 久久综合狠狠 | 波多野结衣在线观看一区 | 欧美成年性 | 视频一区二区视频 | 日日夜夜噜 | 国产欧美日韩一区 | 国产99精品 | 国产h在线观看 | 国产婷婷精品av在线 | 免费碰碰 | 午夜黄色大片 | 久久综合狠狠综合久久狠狠色综合 | 91九色在线视频观看 | 色婷婷久久一区二区 | 午夜91视频 | 免费av网站观看 | 91九色视频在线 | 欧美日韩大片在线观看 | 久久免费黄色网址 | 九九热久久免费视频 | 久草在线综合 | 一区免费观看 | 国产精品99免视看9 国产精品毛片一区视频 | 2018亚洲男人天堂 | 超碰在线97国产 | 天天干夜夜擦 | 91成人网页版 | 天堂网av 在线 | 国产精品免费久久久久 | 久草久热 | 久久经典国产 | 激情av资源| 久久精品毛片 | 久草视频免费在线播放 | 久久人网 | 在线观看av片 | 人人干人人搞 | 香蕉成人在线视频 | 日韩精品视频免费在线观看 | 99久久精品免费看国产麻豆 | 欧美伦理电影一区二区 | 免费看黄电影 | 久久精品视频3 | 国产午夜精品一区二区三区欧美 | 亚洲免费av网站 | 久久久久成| 久久伊人精品天天 | 久久国产精品99国产精 | 在线亚州 | 天天夜夜亚洲 | 亚洲三级在线免费观看 | 在线看片一区 | 黄色小说免费在线观看 | 亚洲区精品 | 久久情侣偷拍 | 日韩动漫免费观看高清完整版在线观看 | 在线播放日韩av | 久久精品视频免费播放 | 国产精品欧美久久久久三级 | 91丨精品丨蝌蚪丨白丝jk | 欧美有色 | 日韩电影精品 | 国产精品黄色av | 欧美三级高清 | 99中文字幕 | 天天操夜夜拍 | 日本中文字幕久久 | 久草视频网| 永久免费在线 | 精品主播网红福利资源观看 | 国产精品亚洲综合久久 | 欧美成人免费在线 | 日韩免费成人av | 成年人在线看视频 | 久久99国产精品二区护士 | av日韩国产 | 国产精品中文字幕av | 天天综合天天综合 | 免费看的av片 | 狠狠干激情 | 中文字幕在线视频精品 | 正在播放国产91 | 日韩av成人在线观看 | 久久精国产 | 91亚洲在线观看 | 日韩精品免费在线视频 | 中文字幕文字幕一区二区 | 成人午夜在线电影 | 五月天综合激情网 | 中文字幕在线观看第一页 | 91高清不卡 | 最新在线你懂的 | 亚洲有 在线 | 国产精品美乳一区二区免费 | 久久极品 | 五月婷婷国产 | 久久精品亚洲一区二区三区观看模式 | 毛片一二区 | 激情深爱 | 亚洲国产精品女人久久久 | 国产精品久久久久一区二区国产 | 天天综合网国产 | 一区二区三区 中文字幕 | 国产精品视频内 | 久久综合免费视频 | 四季av综合网站 | 免费在线观看日韩欧美 | 色婷婷天天干 | 99在线精品视频在线观看 | 婷婷丁香视频 | av福利在线导航 | 91豆花在线观看 | 国产视频资源在线观看 | 色99中文字幕 | 一区二区三区四区免费视频 | 久久精品波多野结衣 | 国产色影院 | 欧美va天堂va视频va在线 | 99精品乱码国产在线观看 | 久久免费国产精品 | 久久久久久久久久久国产精品 | 日韩精品高清不卡 | 黄色软件视频大全免费下载 | 亚洲精品视频一二三 | 99久久综合狠狠综合久久 | 一区二区视频网站 | 四虎在线永久免费观看 | 伊人网站 | 亚州精品天堂中文字幕 | 在线看国产精品 | 亚洲欧美成人综合 | 国产粉嫩在线观看 | 中文字幕一二 | 看片一区二区三区 | www.一区二区三区 | 日日草视频 | 成人av在线看 | 国产精品成人国产乱 | 精品视频在线免费观看 | 国产五月婷婷 | 欧美精品久久人人躁人人爽 | 一级成人在线 | 91在线视频免费91 | 美女福利视频 | 欧美韩日在线 | 精品国产一区二区三区四区vr | 日韩精品久久一区二区三区 | 欧美日韩国产页 | 亚洲午夜精品一区二区三区电影院 | 色中色综合| 国产精美视频 | 91精品国自产在线观看 | 热久久视久久精品18亚洲精品 | 91成人免费视频 | 97色综合 | 日韩av进入| 久草视频观看 | 国产在线va| www.黄色在线 | 美女一级毛片视频 | 成年人电影毛片 | 久久一区国产 | 香蕉一区| 在线观av| 亚洲精品美女在线 | 7777xxxx| 在线成人看片 | 91在线免费视频 | 黄色aa久久 | 五月婷婷六月丁香 | 亚洲视频免费视频 | 亚洲成人av一区 | 精品久久免费 | 狠狠色伊人亚洲综合网站野外 | 久久视频这里有精品 | 天天干夜夜操视频 | 国产日韩欧美视频 | 色窝资源 | 三级黄色在线观看 | 狠狠躁夜夜躁人人爽超碰91 | 久久综合狠狠综合久久激情 | 五月婷综合网 | 久久99亚洲热视 | 国产无套一区二区三区久久 | 在线视频观看亚洲 | 国产精品久久久久久久久久ktv | 亚洲第一成网站 | 免费久久片 | 免费网站看av片 | 国产色 在线 | 久久国际影院 | 中文字幕日本特黄aa毛片 | 丁香六月婷婷激情 | 91爱看片| 国产精品久久久久久久久久免费看 | 国产一级二级在线观看 | 国产一级二级三级在线观看 | 五月天婷婷丁香花 | 最近能播放的中文字幕 | 国内免费久久久久久久久久久 | 成人在线免费看视频 | 青青草国产免费 | 精品国产aⅴ一区二区三区 在线直播av | 日韩一级黄色片 | 亚洲最新视频在线播放 | 在线免费观看视频a | 久久精品xxx | 激情婷婷 | 高清精品视频 | 大型av综合网站 | 99中文字幕在线观看 | 日本狠狠干| 日韩网站中文字幕 | 国产1级毛片 | 欧美激精品 | 97色国产 | 日韩欧美xx| 一区av在线播放 | 国产午夜一区二区 | 99精品一区 | 国产视频在线观看一区 | 精品久久片 | 午夜 免费| 日av免费 | 亚洲人xxx | 黄色在线看网站 | 欧美一级免费 | 人人揉人人揉人人揉人人揉97 | 亚洲一区二区三区精品在线观看 | 在线亚洲午夜片av大片 | 全黄色一级片 | 国产精品白丝jk白祙 | 久久久黄色av | 国产一区二区不卡视频 | 亚洲精品国产第一综合99久久 | 国产精品igao视频网入口 | 91桃色国产在线播放 | 高清不卡一区二区在线 | 91大神视频网站 | 欧美激情视频一区二区三区免费 | 欧美日韩一区二区久久 | 精品国产成人在线影院 | 欧洲成人免费 | 国产色视频网站 | 成人va视频 | 福利视频一二区 | 日韩网站在线免费观看 | 91污在线观看 | 成人在线一区二区三区 | 午夜视频在线观看网站 | www.黄色小说.com| 国产高清不卡在线 | 国产精品免费av | 91中文字幕在线观看 | 久久久久久网站 | 国产精品 久久 | 不卡的av | 不卡电影一区二区三区 | 国产视频在线观看一区二区 | 欧美性色黄大片在线观看 | 国产伦理久久精品久久久久_ | 亚洲免费婷婷 | 中文资源在线播放 | 天天做天天爱夜夜爽 | a黄色片在线观看 | 日韩欧美在线观看一区 | 在线观看一区二区视频 | 欧洲精品亚洲精品 | 日本久久免费电影 | 综合婷婷久久 | avove黑丝| 欧美色就是色 | 亚洲成年人免费网站 | 精品美女久久久久久免费 | 最新国产在线观看 | 日韩欧美在线影院 | 三级小视频在线观看 | 日产乱码一二三区别在线 | 一区二区三区免费在线播放 | 午夜精品久久久久久久久久久久久久 | 成人免费共享视频 | 亚洲无人区小视频 | 久久久久久久99 | 精品久久久久国产免费第一页 | 99久久99久久免费精品蜜臀 | 正在播放日韩 | 欧美另类人妖 | 日韩精品一区二区三区在线播放 | 国产精品久久久久aaaa | 国产69精品久久99不卡的观看体验 | 国产毛片在线 | 亚洲成人黄色 | 免费看网站在线 | 国产 欧美 日韩 | 久久精品精品电影网 | 伊人成人久久 | 91桃色国产在线播放 | 成人三级黄色 | 天天操夜夜叫 | 丁香婷婷社区 | 伊人狠狠色丁香婷婷综合 | 久久天天操 | 五月婷婷丁香 | 久热精品国产 | 国产精品久久久久久一二三四五 | 久久久久久久免费观看 | 日韩爱爱片 | 日本在线h | 亚洲综合五月天 | 久久久久久久久久国产精品 | 欧美日韩国产一区 | 婷婷激情小说网 | 国产一级片在线播放 | 97精品超碰一区二区三区 | 少妇bbb搡bbbb搡bbbb | 国产在线精品播放 | 久久精品草 | 国产香蕉久久 | 色综合天天狠狠 |