簡體   English   中英

如何在測試時將模擬對象注入類中?

[英]How to inject a mock object to a class when testing?

我的用戶類如下,

public class UserResource {
  @Inject UserService userService;

  public boolean createUser(User user) {
    DbResponse res = userService.addUser(user);
    if(res.isSuccess){
      return true;
    }else{
      return false;
    }
  }
}

我的測試類看起來如下,

public class UserResourceTest {

  UserResource userResource;

  @BeforeMethod
  void beforeMethod() {
    userResource = new UserResource();
  }

  @Test
  public void test() {
    User user= mock(User.class);
    boolean res= userResource.createUser(user);
    assert(res);
  }
}

如您所見,應將UserService對象注入UserResource類。 如何在我的測試中將模擬UserService對象注入到userResource對象中?

供參考:

  • 這是Jersey JAX-RS項目的一部分。
  • 我正在使用Java CDI,mockito和testNG(作為測試庫)。

考慮通過構造函數注入使用顯式依賴主體,因為它非常清楚地說明了類為了執行其特定功能所需的內容。

public class UserResource {
  private UserService userService;

  @Inject
  public UserResource(UserService userService) {
    this.userService = userService;
  }

  public boolean createUser(User user) {
    DbResponse res = userService.addUser(user);
    if(res.isSuccess){
      return true;
    }else{
      return false;
    }
  }
}

並模擬UserService並將其分配給受測試的主題。 配置測試的所需/模擬行為。

public class UserResourceTest {

  @Test
  public void test() {
    //Arrange
    boolean expected = true; 
    DbResponse mockResponse = mock(DbResponse.class);
    when(mockResponse.isSuccess).thenReturn(expected);

    User user = mock(User.class);
    UserService mockService = mock(UserService.class);
    when(mockService.addUser(user)).thenReturn(mockResponse);

    UserResource userResource = new UserResource(mockService);        

    //Act
    boolean actual = userResource.createUser(user);

    //Assert
    assert(expected == actual);
  }
}

雖然我完全支持@Nkosi的答案,但我想補充一下這個完整性:

使用Mockitos JUnitRule來修改JUnitRule ,如下所述: httpJUnitRule

public class UserResourceTest {
    @Rule 
    public MockitoRule mockitoRule = MockitoJUnit.rule(); 
    @Mock
    private  DbResponse mockResponse;
    @Mock
    private UserService mockService;    

    @Test
    public void test() {
        //Arrange
        boolean expected = true; 
        when(mockResponse.isSuccess).thenReturn(expected);
        when(mockService.addUser(user)).thenReturn(mockResponse);
        // ...

此外,您還可以使用Mockitos @InjectMocks注釋,如下所示:

public class UserResourceTest {
    @Rule 
    public MockitoRule mockitoRule = MockitoJUnit.rule(); 
    @Mock
    private  DbResponse mockResponse;
    @Mock
    private UserService mockService;
    @InjectMocks
    private UserResource userResource; // do not instantiate in test method
     // ...

但我個人會勸阻它。

是的,它更方便,因為它通過反射確定您使用的依賴注入方法。 但是如果你沒有一個“接縫”來注入某個依賴項(既不是Costructor參數 ,也不是非最終屬性,也不是匹配類型的setter ),你就不會遇到我個人覺得有問題的編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM