Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟抽象类中可用的静态方法,该抽象类使用基于spring的单元测试返回servlet上下文_Java_Junit_Powermock_Easymock - Fatal编程技术网

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.getServle‌​getBean(RoleService.class).get(user.getRoleId()).getRights();返回右边的字符串数组,不能模拟整行。你可以模拟一个电话。但是您展示的测试试图做到这一点,即分别模拟该行中的每个调用。您所遇到的问题是由不正确的模拟引起的,这是其中一个模拟不起作用的原因(我猜是由于输入参数不正确),所以这就是我编写上一个建议的原因。在本例中,easymock返回空值。调试测试中的代码,并找出哪个方法调用返回null。这将是您应该修复的错误模拟方法。尝试调试我的代码行webapplicationcontextils.getWebApplicationContext(EasyMock.anyObject(ServletContext.class))本身返回null我还试图传递ServletContext模拟对象来代替ServletContext.class,但仍然返回null您不应该调试测试本身。您需要调试调用模拟的实际代码,并查看哪个调用返回null而不是在模拟中设置的值。