gpt4 book ai didi

java - 尝试使用ApplicationContext时PowerMockito空指针

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

我有一个类名称 ServiceLocator

public class ServiceLocator implements ApplicationContextAware {
private transient ApplicationContext _applicationContext;
private static ServiceLocator _instance = new ServiceLocator();

public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
_instance._applicationContext = applicationContext;
}

public static ApplicationContext getApplicationContext() {
return _instance._applicationContext;
}

public static Object findService(String serviceName) {
return _instance._applicationContext.getBean(serviceName);
}
}

我正在尝试使用该类在 Approver 类方法中查找 Service

public class ApproverService extends AbstractDataService implements  IApproverService {
public void updateCompletedInboxStatus(String status) {
IInboxService inboxService = (IInboxService)ServiceLocator.findService("inboxService");
InboxItem inboxItem = inboxService.getInboxItem("test");
inboxItem.setWorkItemStatus(status);
inboxService.saveInboxItem(inboxItem);
}
}

使用该代码,我尝试使用 PowerMockRunner 编写 Junit

@RunWith(PowerMockRunner.class)
@PrepareForTest({ApproverService.class})
public class ApproverServiceTest {
@InjectMocks
ApproverService approverService;

@Mock
IInboxService inboxService;

@Mock
ServiceLocator serviceLocator;

@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}

@Test
public void updateCompletedInboxStatus() {
RequestAccessHeader reqHdr = new RequestAccessHeader();
reqHdr.setRequestStatus(AccessConstants.REQ_STATUS_HOLD_INT);
String status = "test";

PowerMockito.mockStatic(ServiceLocator.class);
when(serviceLocator.findService("inboxService")).thenReturn(inboxService);

approverService.updateCompletedInboxStatus(status);
}
}

但是我得到了空指针

java.lang.NullPointerException at com.alnt.fabric.common.ServiceLocator.findService(ServiceLocator.java:25) at com.alnt.access.approver.service.ApproverServiceTest.updateCompletedInboxStatus(ApproverServiceTest.java:80)

请帮我找到该问题的解决方案。

最佳答案

静态方法显然没有被模拟。

问题很可能是因为您没有在@PrepareForTest中添加要模拟的类

将其更改为@PrepareForTest({ApproverService.class, ServiceLocator.class})

<小时/>

题外话:

尽管可以编译,但通过实例引用调用静态方法并不是一个好的做法。因此,该行应该是 when(ServiceLocator.findService(...)).thenReturn(inboxService)

另一个问题是,您尝试使用单例模式,但方式错误。单例应该返回一个实例,以便调用者可以调用它的实例方法。您的 findService 最好是一个实例方法,并以 ServiceLocator.getInstance().findService(...) 的形式调用。为了进一步改进,除非你真的需要它成为一个单例,否则你应该将它作为一个普通的对象实例并注入(inject)到需要它的对象中(假设你已经在使用Spring,我认为没有理由制作一个单例)

关于java - 尝试使用ApplicationContext时PowerMockito空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58926226/

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