java 如何验证非静态方法中调用的静态方法?

ffx8fchx  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(166)

我有Animal.class

class Animal {
    int counter;
    public void move() {
        counter += getRandomNumber(1, 10);
    }

    public static int getRandomNumber(int min, int max) {
        return new Random().nextInt(min, max);
    }
}

我用Mockito 5.2.0
已尝试使用mockedStatic接口验证getRandomNumber方法:

@Test
void tryVerifyStaticMethod() {
    try (MockedStatic<Animal> mockedStatic = mockStatic(Animal.class)) {
        mockedStatic.verify(() -> Animal.getRandomNumber(1, 10), times(1));
    }
}

但是我不知道如何在调用getRandomNumber方法的测试中调用非静态move()方法。

6kkfgxo0

6kkfgxo01#

首先,不要测试类的内部细节,测试它的行为。在你的情况下,我会像这样重写动物:

class Animal {
    int counter;
    int Random random;
    public Animal(Random random) {
     this.random = random;
    }

    public void move() {
        counter += getRandomNumber(1, 10);
    }

    // there must be some method which shows the effect of calling move()
    public int getCounter() {
         return counter;
    }

    private int getRandomNumber(int min, int max) {
        return random.nextInt(min, max);
    }
}

那么你的测试就变成了:

@Test
public void testMove() {
    Random random = mock(Random.class);
    when(random.nextInt(1, 10)).thenReturn(5);
    Animal animal = new Animal(random);
    animal.move();
    assertEquals(5, animal.getCounter());
}

避免在你想要测试的类中调用new。如果愿意,您可以将getRandomeNumber保持为static,并将Random示例作为参数传递给它,但我认为这样做没有什么好的理由。

相关问题