Java 使用方法依赖性测试util类

Java 使用方法依赖性测试util类,java,unit-testing,junit,mockito,powermock,Java,Unit Testing,Junit,Mockito,Powermock,我有一个实用程序类,我需要进行一些单元测试,但在这个实用程序类中,我有一些依赖于同一实用程序类中其他实用程序的方法 为此,我使用以下依赖项: jUnit:4.12 莫基托:2.8 Powermock:1.7 很明显,我正在使用Java来执行代码 现在转到示例代码: public final class AppUtils { private AppUtils () { throw new UnsupportedOperationException("This class

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

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

jUnit:4.12 莫基托: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


如果有人能帮助我,我非常感谢。

单元测试验证被测代码的公共可观察行为

CUT的公共可观察行为包括返回值和与其依赖项的通信

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

顺便说一句: 没有这样的规则,即提供基本或公共功能的实用程序类必须只有静态方法。 这只是一种常见的误解,其原因是习惯于只使用静态方法和实用程序类来命名类

在使用它之前,让所有实用工具方法都非静态并实例化类是完全可以的


依赖注入而不是Singelton模式将帮助您在程序中只使用一个实例…

是的,我需要使用easymockSimple:不要这样做。蒂莫西很合适。如果静态方法在单元测试期间被调用时会中断,那么请确保这些方法不会中断。按照提姆的建议,让这些东西不是静态的,比如说,让它成为非静态的,这是额外的荣誉@幽灵猫,这是我对风车的战争;o