Java 使用PowerMockito模拟接口实现

Java 使用PowerMockito模拟接口实现,java,unit-testing,mockito,powermockito,Java,Unit Testing,Mockito,Powermockito,我需要模拟在代码中实现接口的调用 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 valid

我需要模拟在代码中实现接口的调用

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或mock模拟
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); 
    }
}

这似乎不起作用,我该如何模拟界面?

用户
注入
验证服务
,而不是在
验证服务
中创建它。例如:

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和依赖注入


注意:依赖注入不需要使用Spring或Guice或其他任何东西。这些库只是实现DI的一种手段。通过传入依赖类(通过构造函数或setter)手动构造对象是实现DI的另一种方法。这里的关键点是,当您构建一个供测试用例使用的
ValidationService
时,采用这种方法将允许您注入不同的
User
实现

依赖注入不需要使用Spring,它是一种方法,Spring只是实现它的一种方式。Guice是实现它的另一种方式。通过传递对象的依赖类(通过构造函数或setter)手动构造对象是实现它的另一种方法。这里的关键点是,当您构建一个供测试用例使用的
ValidationService
时,采用这种方法将允许您注入不同的
User
实现。