1

所以,我有一个方法,它接受一个 Object 参数,并根据它的值调用不同的方法(我只使用 if 语句而不是 switch)。

public class ClassToTest {

    public void methodToTest(String input) {
        if (input.equals("A")) {
            ServiceClass.methodA();
        }
        if (input.contentEquals("B")) {
            ServiceClass.methodB();
        }
        if (input.contentEquals("C")) {
            ServiceClass.methodC();
        }
    }
}
public class ServiceClass {

    public static void methodA() {
        System.out.println("A");
    }

    public static void methodB() {
        System.out.println("B");
    }

    public static void methodC() {
        System.out.println("C");
    }
}

我知道 JUnitParamsRunner 简化了参数化测试的编写,并且我知道 Mockito.verify() 来检查是否调用了特定方法。但在我的情况下,是否可以对不同的输入进行参数化测试并检查是否调用了相应的方法?还是对于 verify() 我需要为每个场景编写单独的测试。

4

1 回答 1

0

看起来您想验证 ServiceClass 中的静态方法。在那种情况下Mockito不能帮助你,因为它不能处理静态方法。你可能想用PowerMockito这个。

这里有一个例子说明这会是什么样子。使用PowerMockito 2.0.4和 mockito2 api 进行测试。

@RunWith(PowerMockRunner.class)
@PrepareForTest(ServiceClass.class)
@PowerMockRunnerDelegate(JUnitParamsRunner.class)
public class ParamsTest {

    @Test
    @Parameters({"A", "B", "C"})
    public void test(String input) throws Exception {

        PowerMockito.mockStatic(ServiceClass.class);

        new ClassToTest().methodToTest(input);

        PowerMockito.verifyStatic(ServiceClass.class);

        switch (input) {
            case "A":
                ServiceClass.methodA();
                break;
            case "B":
                ServiceClass.methodB();
                break;
            case "C":
                ServiceClass.methodC();
                break;
            default:
                Assert.fail();
        }
    }
}

验证部分看起来相当难看,所以我不确定是否值得这样做。

也应该可以将验证部分作为另一个参数传递给测试,但这并不能真正让它变得更好。

于 2019-11-13T18:04:07.130 回答