测试时如何将模拟对象注入类?

Las*_*apa 2 java unit-testing mockito

我的用户类别如下

public class UserResource {
  @Inject UserService userService;

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

我的测试课如下

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,应该将UserService对象注入UserResource类。如何在测试中将模拟的UserService对象注入到userResource对象?

仅供参考:

  • 这是Jersey JAX-RS项目的一部分。
  • 我正在使用Java CDI,mockito和testNG(作为测试库)。

Nko*_*osi 5

考虑通过构造函数注入使用显式依赖关系主体,因为它非常清楚地说明了类执行其特定功能所需的条件。

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并模拟并将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);
  }
}
Run Code Online (Sandbox Code Playgroud)