Eclipse调试器无法与Junit中的Power Rule正常工作

10

我正在使用Mockito + PowerMock + PowerRule进行Junits测试。

请参考我的之前的问题:在使用Mockito进行Junit测试时,使用PowerMock和PowerRule出现javassist未找到的问题

现在我已经成功地进行了我的Junits测试,但出现了一个奇怪的问题:Eclipse调试器不起作用,即使我已经执行了测试(通过SOP语句进行检查)。

当我从Junits中移除PowerRule时,调试器又能正常工作了。

我不知道这是为什么,请告诉我你是否有任何想法。

谢谢!


在IntelliJ IDEA中同样的问题。 - DKIT
在Eclipse中也有同样的问题。 - Sandro Simas
2个回答

4
如果您在类级别上使用了注释@PrepareForTest({ClassName.class}),那么问题就会出现。 一个解决方法是将该注释声明在方法中。这样即使在测试用例中使用了PowerMocking,也可以进行调试。

我尝试了 @PrepareForTest({ElasticSearchUtility.class}) @Test public void getIndexesTobedeleted() throws Exception {..} 但问题仍然存在。 - Nagappa L M
你是指源代码方法/依赖方法吗? - Nagappa L M
以上解决方案可行,将@PrepareForTest移动到方法级别后,我能够进行调试。谢谢。使用的是Eclipse IDE 2019-03。 - sriramdev

1
不要在此情况下使用mockStatic,这将模拟整个静态类,这就是为什么您无法对其进行调试的原因。
相反,使用以下其中之一避免模拟整个静态类:
  • spy

    PowerMockito.spy(CasSessionUtil.class) PowerMockito.when(CasSessionUtil.getCarrierId()).thenReturn(1L);

  • 或者stub

    PowerMockito.stub(PowerMockito.method(CasSessionUtil.class, "getCarrierId")).toReturn(1L);

  • 并且使用stub,如果方法有参数(例如String和boolean),请执行以下操作:

    PowerMockito.stub(PowerMockito.method(CasSessionUtil.class, "methodName", String.class, Boolean.class)).toReturn(1L);

这是最终代码,我选择使用stub:
@RunWith(PowerMockRunner.class) // replaces the PowerMockRule rule
@PrepareForTest({ CasSessionUtil.class })
public class TestClass extends AbstractShiroTest {

    @Autowired
    SomeService someService;

    @Before
    public void setUp() {
        Map<String, Object> newMap = new HashMap<String, Object>();
        newMap.put("userTimeZone", "Asia/Calcutta");
        Subject subjectUnderTest = mock(Subject.class);
        when(subjectUnderTest.getPrincipal())
            .thenReturn(LMPTestConstants.USER_NAME);
        Session session = mock(Session.class);
        when(session.getAttribute(LMPCoreConstants.USER_DETAILS_MAP))
            .thenReturn(newMap);
        when(subjectUnderTest.getSession(false))
            .thenReturn(session);
        setSubject(subjectUnderTest);
        // instead, add the getCarrierId() as a method that should be intercepted and return another value (i.e. the value you want)
        PowerMockito.stub(PowerMockito.method(CasSessionUtil.class, "getCarrierId"))
            .toReturn(1L);
    }

    @Test
    public void myTestMethod() {
        someService.doSomething();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接