1

我正在尝试测试该方法:

@Override
    public boolean test(Apple apple) {
        if (apple == null) {
            return false;
        }
        return "green".equals(apple.getColor());
}

我的第一个猜测是通过以下方式对其进行测试:

package io.warthog.designpatterns.behaviorparameterization.impl;

import io.warthog.designpatterns.behaviorparameterization.Apple; import org.junit.Test;

import static org.mockito.Mockito.when;

public class AppleGreenColorPredicateTest {

    private AppleGreenColorPredicate classUnderTest = new AppleGreenColorPredicate();

    @Test
    public void test_WithGreenApple_ReturnsTrue() {
        Apple apple = new Apple();
        apple.setColor("green");
        when(classUnderTest.test(apple)).thenReturn(true);
    }

}

但它给了我错误信息:

org.mockito.exceptions.misusing.MissingMethodInvocationException: when() 需要一个参数,该参数必须是“模拟的方法调用”。例如:when(mock.getArticles()).thenReturn(articles);

所以我最终做了:

package io.warthog.designpatterns.behaviorparameterization.impl;

import io.warthog.designpatterns.behaviorparameterization.Apple; import org.junit.Assert; import org.junit.Test;

public class AppleGreenColorPredicateTest {

    private AppleGreenColorPredicate classUnderTest = new AppleGreenColorPredicate();

    @Test
    public void test_WithGreenApple_ReturnsTrue() {
        Apple apple = new Apple();
        apple.setColor("green");
        Assert.assertEquals(true, classUnderTest.test(apple));
    }

}

这里的问题是,您何时建议使用 Mockinto.when() 方法以及何时使用 Assert.equals()。

任何帮助将不胜感激!

4

1 回答 1

1

我会遵循 XP 规则,做最简单的事情可能会奏效。你不需要模拟任何东西,所以直接使用对象。

private AppleGreenColorPredicate classUnderTest;

@Before
public void setUp() {
    classUnderTest = new AppleGreenColorPredicate();
}

@Test
public void nullTest() {
    assertFalse(classUnderTest.test(null));
}

@Test
public void green() {
    Apple a = new Apple();
    a.setColor("green");
    assertTrue(classUnderTest.test(a));
}

@Test
public void notGreen() {
    Apple a = new Apple();
    a.setColor("red");
    assertFalse(classUnderTest.test(a));
}

在您的模拟代码中,您似乎在模拟您正在测试的内容,也就是说,您不会在代码中发现任何问题,因为您的测试只调用模拟。这给人一种虚假的安全感。只在必要时模拟。模拟被测类的依赖关系,而不是实际的被测类。

于 2018-02-25T19:32:50.643 回答