java - 使用 PowerMockito 模拟接口(interface)实现

标签 java unit-testing mockito powermockito

我需要模拟在我的代码中实现接口(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/

相关文章:

java - 从 Eclipse 中的模板创建 Heroku 应用程序?

java - 对数组进行排序,以便首先运行最高值

java - 使用 mockito 进行参数命名查询测试

junit - 如何忽略Mockito中void方法内的几个void方法调用

phpunit Mock 返回 null 而原始方法返回字符串

java - Mockito - 深度 stub

java - 如何从图像中检测机器人方向?

java - 限制按键输入以防止垃圾邮件

unit-testing - 针对条件 (A && B && C) || 执行 MCDC D

c# - 关于模拟框架 C# 和单元测试的问题