如何对拥有 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();
}
}
我接到任务对 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();
}
}