Java 如何模拟抽象类中可用的静态方法,该抽象类使用基于spring的单元测试返回servlet上下文
我想模拟通过的静态方法Java 如何模拟抽象类中可用的静态方法,该抽象类使用基于spring的单元测试返回servlet上下文,java,junit,powermock,easymock,Java,Junit,Powermock,Easymock,我想模拟通过的静态方法 UtilityThreadLocal.getServletContext()作为WebApplicationContextils.getWebApplicationContext(UtilityThreadLocal.getServletContext())的参数。 我想使用easy mock+powermock。我可能正试图从xml创建mock,并在测试类中自动编写它们,但无法做到这一点。这是我的代码,它不能正常工作。它返回空指针异常,有时返回非法状态异常 @RunWi
UtilityThreadLocal.getServletContext()
作为WebApplicationContextils.getWebApplicationContext(UtilityThreadLocal.getServletContext())的参数。
我想使用easy mock+powermock。我可能正试图从xml创建mock,并在测试类中自动编写它们,但无法做到这一点。这是我的代码,它不能正常工作。它返回空指针异常
,有时返回非法状态异常
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@PrepareForTest({
WebApplicationContextUtils.class
})
public class LoginServiceTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
@Autowired
private LoginService loginService;
@Test
public void loginTest() throws Exception {
String[] rights = new String[] {
"MANAGE_TENANTS", "MANAGE_USERS", "MANAGE_APPLICATIONS", "MANAGE_SETTINGS", "MANAGE_HISTORY", "MANAGE_OFFICES", "EXPORT_TIMESHEETS", "MANAGE_POLICIES", "MANAGE_ASSETS", "MANAGE_LEAVES"
};
Role roleObj = new Role();
roleObj.setRights(rights);
WebApplicationContext webAppContextMock = createNiceMock(WebApplicationContext.class);
RoleService roleServiceBeanMock = createNiceMock(RoleService.class);
PowerMock.mockStatic(WebApplicationContextUtils.class);
expect(WebApplicationContextUtils.getWebApplicationContext(UtilityThreadLocal.getServletContext())).andReturn(webAppContextMock);
expect(webAppContextMock.getBean(RoleService.class)).andReturn(roleServiceBeanMock);
expect(roleServiceBeanMock.get((long) 2).getRights()).andReturn(rights);
expect(roleObj.getRights()).andReturn(roleObj.getRights());
PowerMock.replay(WebApplicationContextUtils.class);
replay(webAppContextMock);
replay(roleServiceBeanMock);
}
}
像这样模拟对
getWebApplicationContext
的调用
expect(WebApplicationContextUtils.getWebApplicationContext(
EasyMock.anyObject(ServletContext.class)))
.andReturn(webAppContextMock);
这使用非严格匹配,即使用任何参数调用都将返回指定值。您可能会更改其他模拟的设置,以便它们实际匹配参数。使用powermock,您可以模拟静态方法,但您可能不应该这样做,除非它是遗留的或不可用于重构代码@Abhish你需要澄清你的问题,我想模拟一下。rights=webapplicationcontextils.getWebApplicationContext(UtilityThreadLocal.getServletContext()).getBean(RoleService.class).get(user.getRoleId()).getRights();但是,当我尝试模拟getWebApplicationContext时,它返回null。我想模拟enire行WebApplicationContextils.getWebApplicationContext(UtilityThreadLocal.getServlegetBean(RoleService.class).get(user.getRoleId()).getRights();返回右边的字符串数组,不能模拟整行。你可以模拟一个电话。但是您展示的测试试图做到这一点,即分别模拟该行中的每个调用。您所遇到的问题是由不正确的模拟引起的,这是其中一个模拟不起作用的原因(我猜是由于输入参数不正确),所以这就是我编写上一个建议的原因。在本例中,easymock返回空值。调试测试中的代码,并找出哪个方法调用返回null。这将是您应该修复的错误模拟方法。尝试调试我的代码行webapplicationcontextils.getWebApplicationContext(EasyMock.anyObject(ServletContext.class))本身返回null我还试图传递ServletContext模拟对象来代替ServletContext.class,但仍然返回null您不应该调试测试本身。您需要调试调用模拟的实际代码,并查看哪个调用返回null而不是在模拟中设置的值。