junit 如何使用EasyMock和PowerMock模拟构造函数内部初始化的final变量?

uttx8gqw  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(115)

下面提到的代码是实现类,需要模拟junit.exe里面的final变量,并设置所需的值。

public class XyzInterceptor 
    private final int requestLimit;
    private final int responseLimit;
    LimitHealper limitHealper = LimitHealper.getInstance();
    //Constructor
    public XyzInterceptor() {
        requestLimit = limitHealper.getLimits("fff");
        responseLimit = limitHealper.getLimits("fff");
            }

        public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) {

        // Check if rate limit is disabled
        if (requestLimit == 0 && responseLimit == 0) {
            return true;
        }

        //logic inside

        }
}

测试方法

@Test
    public void preHandelWhenLimitIsavailable() {       

        MockHttpServletRequest req = get("/customResource")
                .buildRequest(new MockServletContext());        

        MockHttpServletResponse resp = new MockHttpServletResponse();           

        XyzInterceptor crrli = PowerMock.createPartialMock(XyzInterceptor.class, "XyzInterceptor");
        EasyMock.expect(limitHealper.getLimits(EasyMock.anyObject(String.class))).andReturn(6000).anyTimes();
        EasyMock.replay(limitHealper);
        crrli.preHandle(req, resp, "doesn't matter");        
        Assert.assertEquals(200,resp.getStatus());

    }

运行测试时,出现以下错误org.powermock.reflect.exceptions.MethodNotFoundException:在类com. xx. xx. xx. xx. XyzInterceptor的类层次结构中未找到与名称XyzInterceptor匹配的方法。
注意:在类的顶部,我有这些注解@RunWith(PowerMockRunner.class)@PrepareForTest(XyzInterceptor .class)

xienkqul

xienkqul1#

我将大力提倡设计改进。不要使用单例和通过构造函数注入。

public class XyzInterceptor {
    private final int requestLimit;
    private final int responseLimit;

    public XyzInterceptor(LimitHealper limitHealper) {
        requestLimit = limitHealper.getLimits("fff");
        responseLimit = limitHealper.getLimits("fff");
    }

    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) {

        // Check if rate limit is disabled
        if (requestLimit == 0 && responseLimit == 0) {
            return true;
        }

        //logic inside

    }
}

所以你的测试变成了

@Test
public void preHandelWhenLimitIsavailable() {
    LimitHealper limitHealper = mock(LimitHealper.class);
    expect(limitHealper.getLimits(anyObject(String.class))).andStubReturn(6000);
    replay(limitHealper);

    XyzInterceptor crrli = new XyzInterceptor(limitHealper);

    MockHttpServletRequest req = get("/customResource").buildRequest(new MockServletContext());
    MockHttpServletResponse resp = new MockHttpServletResponse();
    crrli.preHandle(req, resp, "doesn't matter");

    assertEquals(200,resp.getStatus());
}

相关问题