我需要模拟在我的代码中实现接口(interface)的调用
public interface User {
public void getUser(User userId, Role role);
}
public UserService implements User {
public void UserService(User userId, Role role) {
}
}
另一个服务类别:
public ValidationService {
public void validateUser() {
***User user = new UserService(user,role);***
}
}
我想使用 Powermockito 或模拟来模拟 UserService
/User
,该怎么做?
我遵循了这种方法:
@RunWith(PowerMockRunner.class)
@PrepareForTest({UserService.class,User.class})
public class ValidationServiceTest {
@Mock
User user = Mockito.mock(User.class);
@Test
public void getValidUser() {
PowerMockito.whenNew(UserService.class).withAnyArguments().thenReturn(user);
}
}
这似乎不起作用,我该如何模拟界面?
最佳答案
将User
注入(inject)到ValidationService
中,而不是在ValidationService
内部创建它。例如:
public ValidationService {
private User user;
public ValidationService(User user) {
this.user = user;
}
public void validateUser() {
// use the 'user' class member...
}
}
现在,模拟 User
变得简单:
User user = Mockito.mock(User.class);
ValidationService sut = new ValidationService(user);
// establish any test-specific expectations of the User instance here
sut.validateUser();
这里不需要 PowerMock,只需普通的旧式 Mockito 和依赖注入(inject)。
注意:依赖注入(inject)不需要使用 Spring 或 Guice 等。这些库只是实现 DI 的一种手段。通过传入对象的依赖类(通过构造函数或 setter )来手动构造对象是实现 DI 的另一种方法。这里的关键点是,采用这种方法将允许您在构造供测试用例使用的 ValidationService
时注入(inject) User
的不同实现。
关于java - 使用 PowerMockito 模拟接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48567557/