使用方法依赖性测试util类

时间:2017-07-20 23:47:43

标签: java unit-testing junit mockito powermock

我有一个实用程序类,我需要进行一些单元测试,但在这个实用程序类中,我有依赖于同一实用程序类中其他人的方法。

为此,我使用以下依赖项:

  • JUNIT:4.12
  • Mockito:2.8
  • Powermock:1.7

因为我已经明白我正在使用Java来执行我的代码。

现在转到示例代码:

public final class AppUtils {

    private AppUtils () {
        throw new UnsupportedOperationException("This class is not instantiable.");
    }

    public static int plus(int a, int b) {
        return a + b;
    }

    public static float average(int a, int b) {
        return ((float) AppUtils.plus(a, b)) / 2;
    }
}

单元测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({AppUtils.class})
public class AppUtilsTest {

    @Test
    public void testPlus() { //This test must be good.
        assertEquals(6, AppUtils.plus(4, 2));
    }

    @Test
    public void testAverage() {
        PowerMockito.mockStatic(AppUtils.classs);
        when(AppUtils.plus(anyInt())).thenReturn(6);
        assertEquals(3f, AppUtils.average(4, 3), 1e-2d);
    }

}

这样我就进行了单元测试,但这会引发一个错误,因为它告诉我预期结果与实际结果不一致。

expected: 3.000f
actual: 0

这是因为PowerMock使用mockStatic()方法替换了定义的所有静态实现,但是如果没有定义一个静态方法的结果,那么它返回0。

如果有人可以帮助我,我会感谢你。

1 个答案:

答案 0 :(得分:1)

UnitTests验证被测代码的公共可观察行为。

CUT的公共可观察行为包括返回值以及与其依赖关系的通信。

这意味着您将其他方法视为私有的位置,只需查看所调用方法的结果。

顺便说一句:

没有这样的规则“实用程序类”(在某种意义上它们提供基本或通用功能)必须只有静态方法。 这只是一个常见的误解,这种误解是由习惯用静态方法“实用程序类”命名类。

绝对可以使用所有实用程序方法非静态并在使用之前实例化该类。

依赖注入(以及 Singelton模式)将帮助您在程序周围只使用一个实例... < / p>