如何对拥有 class 的字段为私有且 Spring @Autowired 的无效返回方法进行单元测试

How to unit test a void returning method where the fields of the owning class are private and Spring @Autowired

我接到任务对 class 进行单元测试,其中字段自动连接到 Spring beans。主要的 public 方法调用 process return 没什么。这是 class:

的片段
 public class AutoRejector{

    @Autowired
    private MNPServicesWrapper mnpWrapper;
    //some more autowired fields

    public void process() {
        List<RequestInfo> requests = mnpWrapper.getNewMnpRequests();
        ........
    }
 }

MNPServicesWrapper 是一个接口。在测试期间,我想提供我自己的测试实现,在调用 getNewMnpRequests 方法时将 return 一些测试值。

如果我能够通过构造函数或 setter 设置此字段,那将是直截了当的。但是如何设置@Autowired字段呢?

您可以使用 Mockito 和 PowerMock 等模拟框架。它们有助于将模拟对象注入您的测试 class。然后您可以指定方法 returns。 (他们使用反射来注入测试对象。你可以通过使用反射而不使用 Mockito 来做同样的事情) 对于您的 void 方法,您可以断言使用这些模拟框架之一调用 mnpWrapper.getNewMnpRequests() 的次数。

请进一步阅读 Mockito,导入 JAR 并在您的 JAVA 项目中使用。

您在 Mockito 中的代码测试示例为:

  @RunWith(MockitoJUnitRunner.class)
  public class AutoRejectorTest {
    @Mock
    MNPServicesWrapper mnpWrapper;

    @InjectMocks
    AutoRejector autoRejector;

    @Test
    public void processTest(){
       autoRejector.process();
       //Assert that the getNewMnpRequests method was called exactly once
       Mockito.verify(mnpWrapper,times(1)).getNewMnpRequests();
      }
}