gpt4 book ai didi

java - 如何使用 Mockito 模拟类级别方法声明

转载 作者:行者123 更新时间:2023-12-02 09:12:52 24 4
gpt4 key购买 nike

我有一个如下的测试类,我试图通过它来复制我当前的问题。

public class EmployeeResource{
public EmployeeAPI restApi = (EmployeeAPI) EmpRegistrar.getInterface(EmployeeAPI.class); // getInterface is a static method.

public Employee addEmployee( Employee emp){
if(Objects.isNull(emp)) {
restApi.notifyAudit(); // suppose this is some existing legacy code which we don't want to run while running junit.
throw new APIException(CLIENT_ERROR_BAD_REQUEST, “Incorrect Post Request”);
}
// Implementation
}

现在我有这门课的 Junit。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ EmpRegistrar.class })
public class EmployeeResourceTest {

@Before
public void setup() throws Exception {
PowerMockito.mockStatic(EmpRegistrar.class);
EmployeeAPI restApi= Mockito.mock(EmployeeAPI.class);
PowerMockito.when(EmpRegistrar.getInterface(EmployeeAPI.class)).thenReturn(restApi);
PowerMockito.doNothing().when(restApi).notifyAudit();
}

@Test
public void testAddEmployee_Invalid() throws Exception {
EmployeeResource employeeResource = new EmployeeResource();
try {
employeeResource.addEmployee(null);
}
catch (Exception e) {
assertTrue(e instanceof APIException);
assertEquals("Incorrect Post Request", e.getMessage());
}
}
}

因此,当我运行上面的 junit 时,我没有获得 restApi 对象的模拟实例并将其获取为 null,这会在下面的行中给出 NullPointerException

restApi. notifyAudit(); // when it runs through junit.

只是为了验证,当我在 addEmployee 方法本身中添加行 restApi = (EmployeeAPI) EmpRegistrar.getInterface(EmployeeAPI.class); 时,我得到了模拟实例和测试用例通过。

因此,我想与大家核实一下,由于 restApi 的对象实例是在类级别获得的,因此我无法通过 mockito 获取其模拟实例作为范围mockito 适用于该方法本身。或者有什么方法可以实现相同的目的。

这是一个现有的旧代码,我正在我的项目中为其编写 junit。我尝试通过上面的示例测试代码复制相同的内容。因此,如果我在任何地方不清楚,请告诉我。

谢谢-萨姆

最佳答案

使用 powermock:

EmployeeResource employeeResource = new EmployeeResource();
Whitebox.setInternalState(employeeResource, restApi);

如果你有依赖spring-test:

EmployeeResource employeeResource = new EmployeeResource();
ReflectionTestUtils.setField(employeeResource, "restApi", restApi);

关于java - 如何使用 Mockito 模拟类级别方法声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59255575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com