【问题标题】:mocking of instance void method is working without calling 'expectLastCall' method实例 void 方法的模拟在不调用“expectLastCall”方法的情况下工作
【发布时间】:2017-05-05 04:22:38
【问题描述】:

我刚刚编写了示例测试用例,我想在其中模拟一个 void 实例方法。我很惊讶,我的测试用例没有调用 expectLastCall 方法就通过了。我想知道,在模拟实例 void 方法时不需要调用 expectLastCall 吗?

StringUtil.java

package com.sample.util;

import com.sample.model.MethodNotImplementedException;

public class StringUtil {
    public String toUpperAndRepeatStringTwice(String str) {
        String upperCase = str.toUpperCase();
        sendStringToLogger(upperCase);
        return upperCase + upperCase;
    }

    public void sendStringToLogger(String str){
        throw new MethodNotImplementedException();
    }
}

StringUtilTest.java

package com.sample.util;

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ StringUtil.class })
public class StringUtilTest {

    @Test
    public void toUpperAndRepeatStringTwice() {
        StringUtil stringUtil = PowerMock.createPartialMock(StringUtil.class, "sendStringToLogger");

        String str = "HELLO PTR";
        stringUtil.sendStringToLogger(str);
        //PowerMock.expectLastCall().times(1);
        PowerMock.replayAll();

        String result = stringUtil.toUpperAndRepeatStringTwice("hello ptr");

        assertEquals(result, "HELLO PTRHELLO PTR");
    }
}

【问题讨论】:

  • 我想你会找到答案here
  • 只是好奇:您在这里使用 PowerMock 做什么? Mockito 应该能够很好地模拟或监视您的 StringUtil 而无需诉诸 PowerMock...我在这里错过了一个用例吗?
  • 我正在使用 PowerMock 和 EasyMock。只是为了实验
  • @HariKrishna 不要。仅在绝对必要时才使用 PowerMock(因为您必须测试一些您无法更改的第 3 方代码)。如果您正在 实验 / 学习 ...那么建议:选择 Mockito 或纯 EasyMock。了解如何正确使用这些框架,并学习如何编写易于测试的代码。
  • 感谢@GhostCat,但如果我没记错的话,PowerMock 是其他 Mocking 框架(如 Mockito 或 EasyMock)的扩展。我们可以使用 PowerMock+EasyMock(或)PowerMock+Mockito 对。如果我错了,请纠正我。

标签: java junit powermock easymock


【解决方案1】:

expectLastCall 不是必需的。对于 EasyMock 和 PowerMock 层也是如此。所以你是对的。

它用于某些用户的清晰度。因为很明显之前的方法是一个期望而不是一些随机调用。但这更多的是风格问题而不是要求。

您也不需要time(1),因为它是默认值。

顺便说一句,here 的答案是错误的,我已经对此进行了评论。

【讨论】:

  • 即使您进行 verify 调用?
  • 是的。这没什么区别。在录制模式下调用 void 方法会记录下来。
  • 我已经使用 EasyMock 好几年了;今天我知道我只需要expectLastCall() 当我需要调用像times()andThrow() 这样的“后续”方法时。教我这一课让你成为今天 Ghostcat-upvote-party 的嘉宾!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多