![](/img/trans.png)
[英]How to use a mock Object with Assisted Inject instead of real implementation class
[英]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對象中?
供參考:
考慮通過構造函數注入使用顯式依賴主體,因為它非常清楚地說明了類為了執行其特定功能所需的內容。
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
,如下所述: http : JUnitRule
:
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.