【问题标题】:Why mock method is allways correct?为什么模拟方法总是正确的?
【发布时间】:2015-01-15 12:01:46
【问题描述】:

我在 spock 框架中编写了一些单元测试。但是我的测试总是正确的,即使我传递了不正确的值。

class CalculatorTest extends Specification  {

def "Method should return roman number"() {
    given:
        CalculatorApi romanCalculator = Mock()
    when: "I add two numbers as integer"
        romanCalculator.add(2, 2)
    then: "Method should return roman number as String"
        romanCalculator.add(2, 2) >> 32131
}

方法“add”应该返回字符串。在这个测试中,一个方法应该返回 Integer。

public class RomanCalculator implements CalculatorApi {

private RomanConverter romanConverter;

public RomanCalculator() {
    this.romanConverter = new RomanConverter();
}

public String add(int one, int two) throws OperationFail {
    int number = one + two;

    try {
        return romanConverter.convertNumber(number);
    } catch (NumberNotFound e) {
        throw new OperationFail(e.getMessage());
    }
}


public class RomanConverter implements ConverterApi {

public String convertNumber(Integer number) throws NumberNotFound {

    switch(number) {
        case 1: 
            return "I";
        case 2:
            return "II";
        case 3:
            return "III";
        case 4:
            return "IV";
        case 5:
            return "V";
        case 6:
            return "VI";
        case 7:
            return "VII";
        case 8:
            return "VIII";
        case 9:
            return "IX";
        case 10:
            return "X";
        default:
            throw new NumberNotFound();
    }
    }

为什么这个方法不起作用?我刚开始用 mock 学习单元测试。

【问题讨论】:

  • 这段代码是什么意思? 'romanCalculator.add(2, 2) >> 32131'
  • 嘲笑你正在测试的课程毫无意义。
  • 这意味着带有参数 2、2 的方法应该返回值 32131
  • 所以你在 then 部分模拟 romanConverter 并且它总是返回 32131。正如 Vargan 在回答中所说:不要模拟被测类,如果你模拟不要在然后分支,但在设置/给定部分(如果没有更好的地方),你仍然缺少要测试的断言。

标签: java spock


【解决方案1】:

问题是:为什么要模拟? Mock 用于确保没有其他依赖项,以便测试特定方法。可以模拟所有外部依赖项以避免出现问题(例如数据库连接:您想测试使用从数据库检索到的数据的逻辑,因此您想模拟正在执行数据库请求的对象)。 另外,请添加您正在使用的 Mock 库的详细信息。

这里你说如果你用参数(2,2)调用你的方法,它会返回罗马计算器(2,2)的执行,这是错误的。你这里不是测试,Mock不是用来测试你要测试的类,而是简化其他对象,在安全可控的环境下测试你的方法。 示例:

Instance retrieve = new Instance()

method doSomething() {
    retrievedVal = retrieve.retrieveFromDB(something)
    return transform(retrievedVal)
 }

你的测试应该是:

test() {
    Instance retrieve = mock()
    when retrieve(specific something).thenReturn(specificRetrievedVal)

    test doSomething()
 }

我避免了一个完整且完整的示例,以便您可以了解您需要做什么并尝试:)

【讨论】:

  • 好的,谢谢.. 我的问题是因为我不了解模拟的概念。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多