精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Mockito 避坑指南 - 常見錯誤的預防與處理

開發 測試
在本文中,我們將討論開發人員在 Spring Boot 應用程序中使用 Mockito 框架時犯的常見錯誤,以及代碼示例和解釋。

介紹

Mockito 是一個流行的用于測試 Java 應用程序的框架。它提供了一種強大且易于使用的方式來模擬依賴關系和編寫單元測試。然而,剛接觸 Mockito 的開發人員可能會犯一些錯誤,從而導致測試不可靠,甚至導致應用程序出現意外行為。在本文中,我們將討論開發人員在 Spring Boot 應用程序中使用 Mockito 框架時犯的常見錯誤,以及代碼示例和解釋。

1.濫用@Mock和@InjectMocks注釋

開發人員在使用 Mockito 時最常見的錯誤之一是濫用@Mock和@InjectMocks注釋。@Mock注解用于為特定類創建模擬對象,而@InjectMocks注解用于將模擬對象注入到被測試的類中。需要注意的是,@InjectMocks 只能與類一起使用,不能與接口一起使用。

例子:

@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
    
    @Mock
    private MyRepository myRepository;
    
    @InjectMocks
    private MyService myService;
    
    // test methods
    
}

2.不重置Mock對象

Mockito 可創建在多個測試中重用的Mock對象。如果在測試之間未重置Mock對象,則可能會導致意外行為和不可靠的測試。Mockito 提供了一個名為Mockito.reset()的方法,可用于重置所有Mock對象。

例子:

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

@Test
public void test1() {
    Mockito.when(myRepository.findById(1)).thenReturn(Optional.of(new MyObject()));
    // test code
}

@Test
public void test2() {
    Mockito.when(myRepository.findById(2)).thenReturn(Optional.of(new MyObject()));
    // test code
}

@After
public void tearDown() {
    Mockito.reset(myRepository);
}

3.對Mock對象使用錯誤的范圍

Mockito 默認創建范圍為類級別。這意味著同一個Mock對象將用于類中的所有測試方法。但是,如果模擬對象需要為每個測試方法具有不同的狀態或行為,則應使用方法級別的范圍來創建。要創建具有正確范圍的Mock對象,我們可以使用Spring Boot 提供的@MockBean注解。

@MockBean使用示例:

@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserService userService;

    @MockBean
    private UserRepository userRepository;

    @Test
    public void testGetUserById() throws Exception {
        // arrange
        Long userId = 1L;
        User user = new User();
        user.setId(userId);
        user.setName("John Doe");
        Mockito.when(userService.getUserById(userId)).thenReturn(user);

        // act
        MvcResult result = mockMvc.perform(get("/users/{id}", userId))
                .andExpect(status().isOk())
                .andReturn();

        // assert
        String response = result.getResponse().getContentAsString();
        assertThat(response).isEqualTo("{\"id\":1,\"name\":\"John Doe\"}");
        Mockito.verify(userService, times(1)).getUserById(userId);
    }

    @Test
    public void testAddUser() throws Exception {
        // arrange
        User user = new User();
        user.setName("Jane Doe");
        Mockito.when(userService.addUser(user)).thenReturn(user);

        // act
        MvcResult result = mockMvc.perform(post("/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\"name\":\"Jane Doe\"}"))
                .andExpect(status().isOk())
                .andReturn();

        // assert
        String response = result.getResponse().getContentAsString();
        assertThat(response).isEqualTo("{\"id\":null,\"name\":\"Jane Doe\"}");
        Mockito.verify(userService, times(1)).addUser(user);
    }
}

在這個例子中,我們使用@WebMvcTest注解來測試UserController類,并注入MockMvc對象來模擬HTTP請求。我們還使用@MockBean注釋為UserService和UserRepository類創建模擬對象。

注意,這里不需要在測試之間重置Mock對象,因為@MockBean注解會為每個測試方法創建Mock對象的新實例。

4.不驗證Mock對象

Mockito 提供了 Mockito.verify()的方法,可用于驗證是否使用特定參數調用了Mock對象。如果Mock對象未經驗證,可能會導致不可靠的測試和意外的行為。

Mockito.verify()使用示例:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetUserById() {
        // arrange
        Long userId = 1L;
        User user = new User();
        user.setId(userId);
        user.setName("John Doe");
        Mockito.when(userRepository.findById(userId)).thenReturn(Optional.of(user));

        // act
        User result = userService.getUserById(userId);

        // assert
        assertThat(result).isEqualTo(user);
        Mockito.verify(userRepository, times(1)).findById(userId);
    }

    @Test
    public void testGetUserByIdNotFound() {
        // arrange
        Long userId = 1L;
        Mockito.when(userRepository.findById(userId)).thenReturn(Optional.empty());

        // act
        UserNotFoundException exception = assertThrows(UserNotFoundException.class, () -> {
            userService.getUserById(userId);
        });

        // assert
        assertThat(exception.getMessage()).isEqualTo("User not found with ID: " + userId);
        Mockito.verify(userRepository, times(1)).findById(userId);
    }
}

請注意,我們使用該Mockito.verify()方法來驗證兩個測試方法是否使用正確的 ID 并僅調用了該類的findById()方法一次。使用times(1)參數來指定該方法應該被調用一次,并傳入正確的 ID 作為參數。如果未使用正確的 ID 調用該方法,或者多次調用該方法,則測試將失敗。

5.不指定Mock對象的行為

Mockito 默認創建Mock對象,默認行為是“不執行任何操作”。這意味著,如果在Mock對象上調用方法并且未指定任何行為,則該方法將僅返回 null 或其返回類型的默認值。指定Mock對象的行為來確保它們在測試中按預期運行非常重要。下面是使用Mockito.when()方法指定Mock對象的行為的示例:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetAllUsers() {
        // arrange
        List<User> users = Arrays.asList(
                new User(1L, "John Doe"),
                new User(2L, "Jane Doe")
        );
        Mockito.when(userRepository.findAll()).thenReturn(users);

        // act
        List<User> result = userService.getAllUsers();

        // assert
        assertThat(result).isEqualTo(users);
    }

    @Test
    public void testGetAllUsersEmpty() {
        // arrange
        List<User> users = Collections.emptyList();
        Mockito.when(userRepository.findAll()).thenReturn(users);

        // act
        List<User> result = userService.getAllUsers();

        // assert
        assertThat(result).isEqualTo(users);
    }
}

6.使用錯誤的方法驗證模擬對象

Mockito 提供了幾種方法來驗證是否使用特定參數調用了Mock對象,例如Mockito.verify()、Mockito.verifyZeroInteractions () 和Mockito.verifyNoMoreInteractions () 。使用正確的方法進行所需的驗證非常重要,因為使用錯誤的方法可能會導致不可靠的測試和意外的行為。Mockito.verify()方法使用示例:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetAllUsers() {
        // arrange
        List<User> users = Arrays.asList(
                new User(1L, "John Doe"),
                new User(2L, "Jane Doe")
        );
        Mockito.when(userRepository.findAll()).thenReturn(users);

        // act
        List<User> result = userService.getAllUsers();

        // assert
        assertThat(result).isEqualTo(users);
        Mockito.verify(userRepository).findAll();
        Mockito.verifyNoMoreInteractions(userRepository);
    }

    @Test
    public void testEmptyUserList() {
        // arrange
        List<User> users = Collections.emptyList();
        Mockito.when(userRepository.findAll()).thenReturn(users);

        // act
        List<User> result = userService.getAllUsers();

        // assert
        assertThat(result).isEqualTo(users);
        Mockito.verify(userRepository).findAll();
        Mockito.verifyNoMoreInteractions(userRepository);
        Mockito.verifyZeroInteractions(userRepository);
    }
}

在第二個測試用例中,我們使用Mockito.verifyZeroInteractions()方法來驗證測試期間沒有與Mock對象發生交互。這確保只測試我們想要測試的行為,并且代碼中不會發生意外的交互。

7.不處理異常

以下是使用 Mockito 時如何處理異常的示例:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetUserById() {
        // arrange
        Long userId = 1L;
        User user = new User();
        user.setId(userId);
        user.setName("John Doe");
        Mockito.when(userRepository.findById(userId)).thenReturn(Optional.of(user));

        // act
        User result = userService.getUserById(userId);

        // assert
        assertThat(result).isEqualTo(user);
    }

    @Test
    public void testGetUserByIdNotFound() {
        // arrange
        Long userId = 1L;
        Mockito.when(userRepository.findById(userId)).thenReturn(Optional.empty());

        // act and assert
        UserNotFoundException exception = assertThrows(UserNotFoundException.class, () -> {
            userService.getUserById(userId);
        });

        assertThat(exception.getMessage()).isEqualTo("User not found with ID: " + userId);
    }
}

在testGetUserByIdNotFound()方法中,我們Mock UserRepository 類的 findById() 方法以返回一個空的可選值。然后,我們使用特定 ID 調用UserService類的getUserById()方法,并且期望該方法拋出UserNotFoundException. 然后使用assertThrows()方法來驗證是否拋出了正確的異常,并且我們還使用getMessage()異常的方法來驗證是否返回了正確的消息。

8.不使用正確的匹配器

以下是使用 Mockito 時如何使用正確匹配器的示例:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testAddUser() {
        // arrange
        User user = new User();
        user.setName("John Doe");
        user.setAge(30);

        // act
        userService.addUser(user);

        // assert
        ArgumentCaptor<User> captor = ArgumentCaptor.forClass(User.class);
        Mockito.verify(userRepository).save(captor.capture());
        assertThat(captor.getValue().getName()).isEqualTo("John Doe");
        assertThat(captor.getValue().getAge()).isEqualTo(30);
    }
}

使用ArgumentCaptor類來捕獲傳遞給UserRepository類的save()方法的參數值。我們還使用Mockito.eq()方法來指定方法調用的參數值,使用user.getName()和user.getAge()方法來獲取正確的值。這有助于確保向方法傳遞正確的參數,并避免在測試中出現意外的行為。

下面是另一個示例:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testDeleteUserById() {
        // arrange
        Long userId = 1L;

        // act
        userService.deleteUserById(userId);

        // assert
        Mockito.verify(userRepository, Mockito.times(1)).deleteById(Mockito.eq(userId));
    }
}

使用Mockito.eq()方法來指定deleteById()方法調用的參數值。這確保了正確的ID被傳遞給該方法,并避免了測試中的意外行為。

9.沒有對Mock對象使用正確的注解

以下是使用@MockBean 和 @RunWith 注解示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @MockBean
    private UserRepository userRepository;

    @Test
    public void testGetAllUsers() {
        // arrange
        List<User> users = Arrays.asList(
                new User(1L, "John Doe"),
                new User(2L, "Jane Doe")
        );
        Mockito.when(userRepository.findAll()).thenReturn(users);

        // act
        List<User> result = userService.getAllUsers();

        // assert
        assertThat(result).isEqualTo(users);
    }
}

使用@RunWith和@SpringBootTest注解來配置單元測試的Spring測試框架。通過使用這些注解,我們可以確保應用程序上下文被加載并且依賴項被正確地注入。

10.未使用正確的測試配置

我們希望使用正確的配置,以確保正確加載應用程序上下文并按預期注入依賴項。以下是使用@ContextConfiguration 的示例:

@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration(classes = {UserService.class, UserRepository.class})
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetAllUsers() {
        // arrange
        List<User> users = Arrays.asList(
                new User(1L, "John Doe"),
                new User(2L, "Jane Doe")
        );
        Mockito.when(userRepository.findAll()).thenReturn(users);

        // act
        List<User> result = userService.getAllUsers();

        // assert
        assertThat(result).isEqualTo(users);
    }
}

使用@ContextConfiguration注解來指定測試的配置。我們將一個類數組傳遞給它,其中包括UserService和UserRepository類,這樣可以確保它們被加載到應用程序上下文中。

11.沒有使用正確的方法來創建Mock對象

使用正確的方法來創建Mock對象,以確保依賴項的行為是可控的并且測試是可靠的。以下是使用Mockito.mock()的示例:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    private UserService userService;

    private UserRepository userRepository;

    @Before
    public void setUp() {
        userRepository = Mockito.mock(UserRepository.class);
        userService = new UserService(userRepository);
    }

    @Test
    public void testGetAllUsers() {
        // arrange
        List<User> users = Arrays.asList(
                new User(1L, "John Doe"),
                new User(2L, "Jane Doe")
        );
        Mockito.when(userRepository.findAll()).thenReturn(users);

        // act
        List<User> result = userService.getAllUsers();

        // assert
        assertThat(result).isEqualTo(users);
    }
}

使用了Mockito.when()方法來指定Mock對象的行為,即當findAll()方法被調用時,返回一個User對象的列表。

12.沒有使用正確的方法來存根Mock對象

使用正確的方法來存根Mock對象,以確保依賴項的行為可以控制并且測試是可靠的。以下是使用when().thenReturn()的示例:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testGetAllUsers() {
        // arrange
        List<User> users = Arrays.asList(
                new User(1L, "John Doe"),
                new User(2L, "Jane Doe")
        );
        Mockito.when(userRepository.findAll()).thenReturn(users);

        // act
        List<User> result = userService.getAllUsers();

        // assert
        assertThat(result).isEqualTo(users);
    }
}

通過使用Mockito提供的when().thenReturn()方法,我們可以指定模擬對象的行為并確保在測試中控制依賴項。

13.沒有使用正確的方法來驗證Mock對象的交互

Mockito 提供了幾種驗證 Mock對象交互的方法,例如Mockito.verify()、Mockito.verifyZeroInteractions()和Mockito.verifyNoMoreInteractions()。使用正確的方法來實現所需的行為非常重要,因為使用錯誤的方法可能會導致不可靠的測試和意外的行為。

@Test
public void test() {
    MyObject myObject = new MyObject();
    myObject.setName("Name");
    Mockito.when(myRepository.findById(1)).thenReturn(Optional.of(myObject));
    
    MyObject result = myService.findById(1);
    
    Mockito.verify(myRepository).findById(1);
    Mockito.verifyNoMoreInteractions(myRepository);
    Assert.assertEquals("Name", result.getName());
}

14.沒有使用正確的方法來驗證Mock對象的交互順序

Mockito 提供了一個名為Mockito.inOrder()的方法,可用于驗證與模擬對象交互的順序。在驗證交互順序時使用此方法非常重要。

@Test
public void test() {
    MyObject myObject1 = new MyObject();
    myObject1.setName("Name 1");
    MyObject myObject2 = new MyObject();
    myObject2.setName("Name 2");
    InOrder inOrder = Mockito.inOrder(myRepository);
    
    Mockito.when(myRepository.findById(1)).thenReturn(Optional.of(myObject1));
    Mockito.when(myRepository.findById(2)).thenReturn(Optional.of(myObject2));
    
    MyObject result1 = myService.findById(1);
    MyObject result2 = myService.findById(2);
    
    inOrder.verify(myRepository).findById(1);
    inOrder.verify(myRepository).findById(2);
    Assert.assertEquals("Name 1", result1.getName());
    Assert.assertEquals("Name 2", result2.getName());
}

結論

Mockito 是一個強大的測試框架。但是,剛接觸 Mockito 的開發人員可能會犯錯誤,從而導致應用程序中的測試不可靠和出現意外行為。

責任編輯:華軒 來源: 今日頭條
相關推薦

2024-04-03 12:30:00

C++開發

2019-10-17 09:58:01

深度學習編程人工智能

2025-03-26 02:00:00

API工具開發

2024-04-24 13:45:00

2021-02-26 00:46:11

CIO數據決策數字化轉型

2022-01-23 14:29:25

C語言編程語言

2020-12-16 10:00:59

Serverless數字化云原生

2023-05-24 10:06:42

多云實踐避坑

2021-05-07 21:53:44

Python 程序pyinstaller

2021-02-22 17:00:31

Service Mes微服務開發

2021-05-08 12:30:03

Pythonexe代碼

2022-03-04 18:11:16

信服云

2018-01-20 20:46:33

2025-05-06 08:21:35

2024-08-26 08:29:55

2020-06-12 11:03:22

Python開發工具

2024-12-31 15:52:43

2024-07-04 09:05:30

2021-04-28 09:26:25

公有云DTS工具

2025-10-15 03:10:00

點贊
收藏

51CTO技術棧公眾號

日韩精品国内| 日韩亚洲欧美高清| 日韩欧美激情一区二区| 国产精品欧美亚洲| 影音先锋久久久| 国模 一区 二区 三区| 国产欧美日韩麻豆91| 91久久久国产精品| 国产 日韩 欧美 在线| 婷婷久久国产对白刺激五月99| 欧美精品一区二区蜜臀亚洲| 性刺激的欧美三级视频| 波多野结衣视频一区二区| 国产精品久久久久桃色tv| 国产一区二区高清不卡| 亚洲一区二区激情| 性欧美videos另类喷潮| 欧美xxxx18性欧美| 2019男人天堂| 亚洲都市激情| 精品国产一区二区三区av性色 | 国产chinese中国hdxxxx| av成人在线观看| 精品免费在线观看| 日韩激情视频一区二区| 日本最新在线视频| 91视频xxxx| 国产精品一国产精品最新章节| 亚洲视频一区在线播放| 亚洲欧美成人综合| 韩国欧美亚洲国产| 久久久久性色av无码一区二区| 国产精品91一区二区三区| 亚洲午夜久久久久久久| 女人被狂躁c到高潮| 成人午夜大片| 91精品国产欧美一区二区18| 蜜臀av免费观看| 亚洲第一影院| 色丁香久综合在线久综合在线观看 | 深夜视频在线免费| 成人蜜臀av电影| www.一区二区三区| 国产特黄一级片| 久久电影网站中文字幕 | 国产 日韩 欧美在线| 怡红院在线观看| 亚洲美女视频一区| 中文字幕在线乱| 国产黄色小视频在线| 最新国产成人在线观看| 一本一道久久a久久精品综合| 国产精品久久一区二区三区不卡| 久久久久久免费毛片精品| 久久综合九色欧美狠狠| 暖暖视频在线免费观看| 久久久久久久久久久黄色 | 激情小说 在线视频| 91免费观看视频在线| 久久资源亚洲| 成年人在线观看视频| 国产精品伦一区二区三级视频| 亚洲欧洲日夜超级视频| 欧美高清视频| 在线视频 91| 日本不卡123| 国产精品小说在线| 国自在线精品视频| 91嫩草丨国产丨精品| 欧美日韩hd| 97香蕉超级碰碰久久免费的优势| 欧美不卡视频在线观看| 久久一二三四| 91精品久久久久久久久久入口| www.污视频| 91丨porny丨国产入口| 日韩精品资源| а天堂中文在线官网| 亚洲国产日韩a在线播放性色| ww国产内射精品后入国产| 韩国美女久久| 91精品国产入口在线| 一级黄色片毛片| 欧美自拍偷拍| 九九精品视频在线| 日韩 欧美 中文| 国产中文字幕精品| 一本色道亚洲精品aⅴ| 免费日韩视频在线观看| 欧美电影在线观看网站| 日韩精品综合一本久道在线视频| 国产真实乱人偷精品| 久操成人av| 欧美成人在线网站| 天堂中文在线网| 久久国内精品自在自线400部| 黄色片免费观看视频| 91蜜臀精品国产自偷在线| 欧美精品日韩三级| 午夜影院免费在线观看| 精一区二区三区| 精品亚洲欧美日韩| 久草资源在线观看| 第一福利永久视频精品| 天天干天天曰天天操| 你微笑时很美电视剧整集高清不卡 | 国产欧美视频一区二区| h无码动漫在线观看| 亚洲日本网址| 亚洲国产精品va| 999精品视频在线观看播放| 一区二区三区高清视频在线观看| 91久久精品国产| 国产视频网站在线| 精品成人av一区| 国产伦精品一区二区三区妓女下载| 综合干狼人综合首页| 欧美激情小视频| 国产又黄又大又粗的视频| 久久人人爽爽爽人久久久| 精品视频在线观看一区二区| 欧美美女福利视频| 国产香蕉一区二区三区在线视频| 国产精品成人国产乱| 韩国一区二区三区| 日韩欧美在线观看强乱免费| 国产伦理精品| 欧美不卡一二三| 成年人一级黄色片| 精品无人区卡一卡二卡三乱码免费卡| 欧美一区二区高清在线观看| 欧亚在线中文字幕免费| 成人av片在线观看| 精品国产91洋老外米糕| 日本黄色录像视频| 久久综合综合久久综合| 日韩久久久久久久| 成人午夜精品| 亚洲色图狂野欧美| 无码人妻精品一区二区三区蜜桃91| 成人激情免费电影网址| 男人天堂a在线| 欧美黄视频在线观看| 久久人体大胆视频| 国产精品福利电影| 自拍偷拍亚洲综合| 肉色超薄丝袜脚交| 欧美91大片| 亚洲综合中文字幕在线观看| 自拍亚洲图区| 欧美大片在线观看| 日本一级淫片免费放| 成人国产精品免费观看| 欧美日韩性生活片| 亚洲裸色大胆大尺寸艺术写真| 欧美性视频精品| 欧美孕妇孕交xxⅹ孕妇交| 一本色道久久综合亚洲aⅴ蜜桃| 中国黄色a级片| 日韩精彩视频在线观看| 亚洲国产精品综合| 精品久久免费| 久久久久久成人| 四虎精品在永久在线观看 | 亚洲中文字幕无码av永久| 欧美日韩一区二区三区在线电影| 欧美性受xxx| 自拍视频在线播放| 日韩区在线观看| 国产情侣在线视频| 日本一区二区视频在线观看| 三日本三级少妇三级99| 亚洲欧洲另类| 视频在线一区二区三区| 狂野欧美xxxx韩国少妇| 国内免费久久久久久久久久久| 日韩av视屏| 欧美精品九九99久久| 日韩免费一二三区| 久久精品亚洲乱码伦伦中文| 岛国av在线免费| 国内久久视频| 亚洲成人av动漫| 欧美成年网站| 日本久久久久久久久久久| 日本不卡不卡| 亚洲国产精品大全| 亚洲一级特黄毛片| 欧美日韩精品在线| 中文字幕美女视频| 26uuu国产在线精品一区二区| 日本人69视频| 国产精品美女久久久浪潮软件| 亚洲欧洲国产精品久久| 牛牛精品成人免费视频| 成人免费午夜电影| 中文字幕资源网在线观看免费| 久久精品国产久精国产一老狼| 天天操天天舔天天干| 欧美美女一区二区在线观看| 色七七影院综合| a级片在线视频| 91成人在线免费观看| 久久一二三四区| 中文字幕巨乱亚洲| 噜噜噜在线视频| 国产精品综合二区| 国产福利影院在线观看| 在线免费观看欧美| 玖玖精品在线视频| 日本a口亚洲| 欧美日韩在线高清| 国产精品高潮呻吟久久久久| 亚洲自拍偷拍区| www.成人在线视频| 欧美性受xxxx黑人猛交| 国产欧美久久久久久久久| 一区二区成人精品| 欧美少妇另类| 亚洲精品aⅴ中文字幕乱码 | 亚洲国产97在线精品一区| 97成人在线观看| 欧美视频中文字幕| 欧美成人一区二区三区四区| 性欧美大战久久久久久久久| 亚洲r级在线观看| 国产色综合天天综合网| 变态调教一区二区三区| 久久视频国产精品免费视频在线| 国产三级在线观看| 日韩精品免费在线| 天天操天天操天天干| 日韩视频中午一区| 99久久精品国产一区色| 欧美日韩国产一区| 小泽玛利亚一区二区三区视频| 黑人巨大精品欧美一区二区一视频| 久久免费播放视频| 亚洲伊人色欲综合网| 黄色一级片在线免费观看| 中文字幕日韩欧美一区二区三区| 少妇高潮惨叫久久久久| 国产精品美女一区二区在线观看| 免费网站在线高清观看| 欧美国产97人人爽人人喊| 日本一二三不卡视频| 中文子幕无线码一区tr| 国产黄a三级三级| 亚洲欧洲精品一区二区三区| 成人欧美一区二区三区黑人一| 中文字幕在线不卡| 午夜国产福利一区二区| 一区二区三区欧美在线观看| 久草资源在线视频| 天天综合色天天综合色h| 草久久免费视频| 色综合色综合色综合| 中文字幕人妻丝袜乱一区三区| 欧美日韩国产综合久久 | 成人免费网址| 欧美日韩不卡合集视频| 超碰在线资源| 欧美亚洲另类制服自拍| 精品欧美一区二区三区在线观看| 国产精品视频精品视频| 国产亚洲高清一区| 国产一区二区不卡视频| 精品理论电影在线| 中文字幕剧情在线观看一区| 国语自产精品视频在线看8查询8| 毛片在线视频播放| 日韩二区三区在线观看| 中文字幕乱妇无码av在线| av中文字幕亚洲| 妺妺窝人体色WWW精品| 国产精品国产三级国产aⅴ入口| 黄视频网站免费看| 激情久久av一区av二区av三区| 久久久久久无码精品大片| 777久久久精品| 四虎永久在线精品免费网址| 在线日韩中文字幕| 蜜臀av在线| 国产精品久久久久免费a∨| 美国十次综合久久| 美日韩精品免费| 一区二区日韩欧美| 久久精品午夜福利| 国产精品一区二区果冻传媒| 一本加勒比波多野结衣| 国产精品久久久久久久久搜平片| 国产91av视频| 欧美日本一区二区| 亚洲色图21p| 久久国产精品影片| 欧美色片在线观看| 国产中文一区二区| 久久久五月天| 日韩中文字幕免费在线| 豆国产96在线|亚洲| 蜜桃av免费在线观看| 大桥未久av一区二区三区| 国产精品久久久久久久成人午夜| 国产视频久久久久| 青春草视频在线| 国产欧美日韩最新| 自拍偷拍欧美一区| 国产精品12345| 国产一区二区精品久久99| 欧美激情亚洲色图| 亚洲成国产人片在线观看| 97视频免费在线| 中国日韩欧美久久久久久久久| 中文字幕乱码在线播放| 国产精品美女黄网| 天天久久综合| 欧美亚日韩国产aⅴ精品中极品| 国产精品无码一区二区三区免费 | 黄网站免费在线| 正在播放亚洲一区| xxxxx日韩| 日本精品久久久久影院| 噜噜噜天天躁狠狠躁夜夜精品| 国产精品88久久久久久妇女| 麻豆精品新av中文字幕| 熟女高潮一区二区三区| 午夜激情一区二区三区| 丰满人妻妇伦又伦精品国产| 欧美噜噜久久久xxx| 久久三级中文| 一二三在线视频| 国产精品99久久久久久有的能看| 亚洲视频重口味| 欧美高清www午色夜在线视频| 在线免费观看黄色av| 国产精品成久久久久三级| 久久99蜜桃| 久久久久久久久久久久久国产精品 | 亚洲高清免费在线| 老司机午夜福利视频| 久久免费国产精品1| 成人激情自拍| 欧美精品久久久久久久免费| av亚洲精华国产精华| 国产午夜小视频| 日韩精品www| 成人美女黄网站| 日韩不卡av| 美国三级日本三级久久99| 91ts人妖另类精品系列| 91超碰这里只有精品国产| 在线黄色网页| 国产伦精品一区二区三区照片91 | 天堂av一区二区三区在线播放| 可以在线看的av网站| 91麻豆高清视频| 波多野结衣家庭主妇| 色七七影院综合| 精品国模一区二区三区欧美| 国产肉体ⅹxxx137大胆| k8久久久一区二区三区| 精品人妻一区二区三区潮喷在线 | 69av成人| 日本免费高清一区| 国产一区二区女| 日产亚洲一区二区三区| 亚洲欧美日韩中文在线| 日韩欧美三区| 国产欧美日韩网站| 国产欧美精品一区| 国产夫绿帽单男3p精品视频| 97香蕉久久超级碰碰高清版| 波多野结衣在线观看一区二区三区| 亚洲午夜精品一区| 天天综合天天做天天综合| yourporn在线观看视频| 91精品国产91久久久久青草| 99精品视频免费观看视频| 人成免费在线视频| 日韩欧美国产综合| 成人福利av| 日韩一级特黄毛片| 久久久国际精品| av一级黄色片| 国产999在线观看| 综合天堂久久久久久久| 中文字幕av网址| 欧美一区二区视频在线观看2022| 日韩深夜视频| 午夜探花在线观看| 国产亚洲污的网站| 亚洲国产精彩视频| 国产精品久久久久秋霞鲁丝| 欧美日韩国产色综合一二三四| 国产aⅴ激情无码久久久无码| 日韩一区二区三区视频| 日韩网站中文字幕| 国产69精品久久久久999小说| 中文无字幕一区二区三区| 丰满人妻一区二区三区免费视频 |