精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

午夜免费一区| 99精品女人在线观看免费视频| 波多野结衣在线一区| 欧美亚洲国产成人精品| 特级西西www444人体聚色| 日韩成人一区| 午夜电影久久久| 少妇免费毛片久久久久久久久 | 成人午夜影视| 国产综合久久久久久鬼色 | 亚洲国产欧美一区二区三区久久| 日韩中文字幕三区| 欧美a免费在线| 99久久久免费精品国产一区二区| 国产精品久久久久久av| 欧美激情国产精品免费| 九一精品国产| 日韩美女主播在线视频一区二区三区| 茄子视频成人免费观看| 免费黄色在线网站| 91免费视频网| 国产91aaa| 国产女18毛片多18精品| 久久综合影音| 91精品国产网站| 欧美黄色免费在线观看| 久久人人99| 亚洲精品一区二区久| 搡的我好爽在线观看免费视频| 一区二区电影免费观看| 亚洲午夜免费电影| 亚洲欧洲精品在线| 国产精品99999| 久久综合一区二区| 精品在线不卡| 天天干,天天操,天天射| 国产不卡一区视频| 91在线无精精品一区二区| 国产成人精品一区二区色戒| 免费在线欧美黄色| 97精品伊人久久久大香线蕉| 久久精品这里只有精品| 中文字幕免费精品| 日韩在线小视频| 鲁丝一区二区三区| 亚洲系列另类av| 精品视频一区在线视频| 少妇一级淫片免费放播放| 激情五月综合婷婷| 91精品一区二区三区久久久久久| 可以看污的网站| 成人免费一区| 欧美日韩精品是欧美日韩精品| www.国产区| 精品日韩视频| 欧美性色黄大片手机版| 男女视频一区二区三区| 性欧美hd调教| 欧美午夜影院一区| 日日噜噜噜噜久久久精品毛片| 我爱我色成人网| 日本丶国产丶欧美色综合| 农村妇女精品一二区| 性欧美超级视频| 欧美日韩精品系列| 在线一区二区不卡| 美女久久精品| 亚洲第一中文字幕在线观看| 人人妻人人澡人人爽人人精品| 丝袜美腿一区二区三区动态图| 亚洲理论在线a中文字幕| 欧美狂猛xxxxx乱大交3| 神马电影久久| 久久精品中文字幕一区| 久久久久亚洲av无码专区体验| 精品二区久久| 欧美在线视频一区| 最近中文字幕在线观看| 狠狠色丁香婷婷综合| 97超碰人人看人人| 青青久草在线| 国产精品传媒视频| 91视频 - 88av| 中老年在线免费视频| 欧美性受极品xxxx喷水| 在线播放国产视频| 午夜先锋成人动漫在线| 中文字幕日韩av| 国产一级在线观看视频| 久久都是精品| 91日本在线视频| 五月天婷婷视频| 国产精品麻豆99久久久久久| 国产精品视频一二三四区| 中国色在线日|韩| 7777精品久久久大香线蕉| 日韩av手机在线播放| 色综合天天爱| 68精品久久久久久欧美| 伊人22222| gogogo免费视频观看亚洲一| 亚洲欧洲精品一区| av毛片午夜不卡高**水| 欧美日韩一区在线| 999精品免费视频| 国产韩国精品一区二区三区| 7777kkkk成人观看| 国产模特av私拍大尺度| 久久精品水蜜桃av综合天堂| 亚洲欧美精品伊人久久| 欧美午夜精品久久久| 1024av视频| 国产麻豆精品| 国产亚洲精品久久久久久| 欧美日韩精品在线观看视频| 日韩精品电影在线| 国产主播一区二区三区四区| 麻豆网在线观看| 色综合婷婷久久| 午夜福利三级理论电影| 日韩国产一区| 国产精品91久久久| 色婷婷av一区二区三| 专区另类欧美日韩| 久久精品影视大全| 蜜桃tv一区二区三区| 国a精品视频大全| av一级黄色片| 亚洲欧洲一区二区在线播放| 天天爱天天操天天干| 日韩av网站在线免费观看| 欧美成人精品一区二区| 中文字字幕在线观看| 久久免费视频色| 国产女大学生av| 91精品丝袜国产高跟在线| www欧美日韩| 中文字幕欧美色图| 国产日韩欧美一区二区三区乱码| 欧美日韩成人免费视频| 草草视频在线一区二区| 欧美高跟鞋交xxxxhd| av男人天堂网| 一区二区三区在线免费播放| 亚洲日本黄色片| 小小影院久久| 亚洲一区中文字幕在线观看| 黄网页在线观看| 在线电影国产精品| 美国一级片在线观看| 美女在线视频一区| 亚洲一一在线| 成人综合日日夜夜| 久久九九免费视频| www.激情五月.com| 亚洲宅男天堂在线观看无病毒| 国产吃瓜黑料一区二区| 欧美午夜电影在线观看| 国产伦精品一区二区三毛| free性m.freesex欧美| 亚洲精品福利免费在线观看| a v视频在线观看| 久久久久高清精品| 亚洲色图久久久| 亚洲精品97| 国产精品国产三级国产专区53| 丰满大乳少妇在线观看网站| 亚洲成人av在线| 亚洲熟妇无码乱子av电影| 国产日本欧美一区二区| 国产3p在线播放| 黄色亚洲精品| 免费久久久一本精品久久区| 成人免费福利| 久久夜色精品亚洲噜噜国产mv | 国产网站在线| 亚洲欧美激情另类校园| 中文字幕丰满人伦在线| 亚洲人成7777| 亚洲av无码一区二区二三区| 男人的j进女人的j一区| 国产911在线观看| 欧美激情网址| 成人黄色免费在线观看| 精灵使的剑舞无删减版在线观看| 日韩电影大片中文字幕| 中文字幕在线观看免费| 亚洲综合精品自拍| 免费看污片网站| 国产一区二区毛片| 乱妇乱女熟妇熟女网站| 成人亚洲一区二区| 国产传媒一区二区| 性欧美freehd18| 欧美黑人国产人伦爽爽爽| 国产毛片在线| 精品sm在线观看| 亚洲手机在线观看| 亚洲成人免费在线观看| 色www亚洲国产阿娇yao| 丁香婷婷综合网| 福利片一区二区三区| 99综合精品| 精品久久久无码人妻字幂| 欧美男男gaytwinkfreevideos| 亚洲最大成人免费视频| 日韩在线影院| 91国偷自产一区二区三区的观看方式| 夜级特黄日本大片_在线| 日韩精品高清在线观看| 伊人22222| 色欧美88888久久久久久影院| 精品无码人妻一区二区三区| 欧美激情一区在线| 欧美成人三级伦在线观看| 国产真实乱对白精彩久久| 中文字幕乱码人妻综合二区三区| 欧美婷婷在线| dy888午夜| 日本欧美肥老太交大片| 欧美xxxx黑人又粗又长密月| 国产伦精品一区二区三区在线播放| 国产伦精品免费视频| 欧美aaa视频| 日本精品久久久久久久| 涩涩视频网站在线观看| 久久久久久久国产| 怡红院在线观看| 另类色图亚洲色图| 日本韩国在线视频爽| 国产午夜精品视频| 青青视频在线观| 日韩精品在线私人| 无码国产精品高潮久久99| 精品美女一区二区三区| 国产三级自拍视频| 5月丁香婷婷综合| 91精品国产乱码久久久久| 欧美视频一区二区| 这里只有久久精品视频| 在线观看免费视频综合| 成人免费视频国产免费| 色狠狠一区二区三区香蕉| 国产精品100| 疯狂做受xxxx高潮欧美日本 | 国产网站在线免费观看| 色偷偷9999www| 久久久久久久久免费视频| 色婷婷av一区二区三区久久| 九色porny在线| 毛片精品免费在线观看| 曰本三级在线| 久久免费国产精品1| 妞干网免费在线视频| 热草久综合在线| 精品欧美一区二区三区在线观看 | 日本精品久久久久中文字幕| 久久综合影视| 久久人人爽av| 国产成人午夜精品5599| 国产伦精品一区二区免费| 97久久精品人人做人人爽50路| 成人影视免费观看| 欧美韩国日本综合| 国产三级aaa| 亚洲最新视频在线观看| 国产无遮无挡120秒| 欧美三级xxx| 伊人成年综合网| 9191成人精品久久| 丰满肥臀噗嗤啊x99av| 亚洲国产精品系列| 超碰97在线免费观看| 不卡伊人av在线播放| 免费毛片在线看片免费丝瓜视频| 2018日韩中文字幕| 福利一区二区| 国产经典一区二区三区| 久久综合欧美| 蜜臀av.com| 久久婷婷一区| 善良的小姨在线| 久久网这里都是精品| 久久精品一区二区三区四区五区| 亚洲中国最大av网站| 蜜臀尤物一区二区三区直播| 欧美一级艳片视频免费观看| 天天av综合网| 久久夜色精品国产欧美乱| 欧产日产国产精品视频| 91在线观看欧美日韩| 西野翔中文久久精品国产| 色撸撸在线观看| 亚洲一区二区毛片| 亚洲精品20p| 久久色中文字幕| 久久久久久久久毛片| 日本乱人伦一区| 成 人 黄 色 片 在线播放 | 黄色网页网址在线免费| 欧美在线观看一区二区三区| 国产精品1区在线| 日韩电影大全在线观看| 国内精品久久久久久久97牛牛 | 97超碰成人| 亚洲日本精品国产第一区| 国产亚洲亚洲| 一起草最新网址| 国产日韩亚洲欧美综合| 日韩欧美亚洲一区二区三区| 欧美精品一二三区| 黄色片在线播放| 77777亚洲午夜久久多人| 日韩区欧美区| 中文字幕日韩一区二区三区 | 国产成人综合精品| 成人在线视频你懂的| 国产高清精品软男同| 日韩电影在线免费| 制服丝袜第二页| 亚洲综合丁香婷婷六月香| 91禁在线观看| 伊人亚洲福利一区二区三区| 欧美gv在线| 精品国产乱码久久久久软件 | 中文字幕亚洲一区二区av在线 | 欧美日韩一级大片| 欧美日韩国产bt| 91在线免费看| 国产精品高清免费在线观看| 亚洲精品小区久久久久久| 国产一级爱c视频| va亚洲va日韩不卡在线观看| 国产亚洲精品久久777777| 欧美一二三四区在线| 黄页视频在线播放| 91中文在线视频| 欧美在线三区| 可以看的av网址| 一区二区三区欧美在线观看| 国产日韩欧美一区二区东京热 | 成人免费网站观看| 999国产在线| 午夜视频精品| 台湾佬美性中文| 亚洲国产wwwccc36天堂| 亚洲精品18在线观看| 欧美高清激情视频| 国产精品zjzjzj在线观看| 日韩欧美精品免费| www.性欧美| 草久视频在线观看| 亚洲美女av在线| 天堂久久午夜av| 一区二区三区在线视频111| 国内精品写真在线观看| 中文字幕av免费在线观看| 精品人在线二区三区| 国产h片在线观看| 欧美日韩日本网| 美腿丝袜亚洲综合| 成年人一级黄色片| 精品捆绑美女sm三区 | 欧美日韩在线视频观看| 久久久资源网| 国产欧美在线播放| 欧美精品播放| 国产肉体xxxx裸体784大胆| 一本到不卡精品视频在线观看| 国产精品一级伦理| 91九色国产视频| 亚洲二区精品| 久久久久久成人网| 777奇米四色成人影色区| 成年人国产在线观看| 欧美精品一区二区三区在线四季 | 日韩黄色中文字幕| 91精品国产综合久久福利软件 | 婷婷开心激情综合| 国产免费永久在线观看| 亚洲aa中文字幕| 国产精品婷婷| 少妇高潮在线观看| 亚洲国产美女久久久久| 日韩精品第一| 无码人妻精品一区二区蜜桃百度| k8久久久一区二区三区| 糖心vlog精品一区二区| 美女性感视频久久久| 亚洲精品白浆高清| 黄色三级视频在线播放| 红桃av永久久久| www在线免费观看视频| 精品国产福利| 激情欧美一区二区| 日韩免费av片| 久久人人爽人人爽爽久久| 久久这里只有精品一区二区| www.超碰97.com| 欧美午夜久久久|