0

我有一个小应用程序,我根据以下内容分配一些内存:

if (RANDOM.nextBoolean()) {
     // Allocate some memory here.
}

为了提高覆盖率,多次重复单元测试并且 JVM 抱怨堆空间不足。分配没有先决条件,我只是想要一些随机分配并避免错误消息。

有没有办法使内存分配的概率小于 1/2?

4

4 回答 4

3

例如大约 1/4 的机会

if (RANDOM.nextDouble() < 0.25) {
     // Allocate some memory here.
}

相应地调整要比较的值。nextDouble () 返回从 0.0 到 1.0 的值

于 2013-11-05T15:10:42.730 回答
1

是的,例如,概率小于 1/2:

if (RANDOM.nextBoolean() && RANDOM.nextBoolean()) {
}
于 2013-11-05T15:10:37.127 回答
1

使您的随机源成为一个外部实例,您可以将其传递给使用它的类。在您的测试中,将其作为模拟对象传入。您将能够控制模拟对象的行为,以便它为您的测试返回可预测的结果。然后你可以为你的测试做任何你想要的概率。

例如:

public class MyClass {
    private final BooleanRandom bRandom;

    public MyClass(BooleanRandom bRandom) {
        this.bRandom = bRandom;
    }

    public void doTheMemoryThing() {
        if (bRandom.nextBoolean()) {
            allocateMemory();

    }
}

在您的测试中,使用 Mockito:

BooleanRandom br = mock(BooleanRandom.class);
when(br.nextBoolean()).thenReturn(true);  // or false, as needed
MyClass mc = new MyClass(br);
// test
mc.doTheMemoryThing();

在此调用中,doTheMemoryThing知道测试将通过。在其他情况下,您可以写nextBoolean返回false以便不分配内存。

于 2013-11-05T15:16:31.503 回答
0

一个更通用的解决方案是使用你想要的任何概率,在这个例子中,13% 的时间你想要一个真值:

public static final boolean getRandomTrue(final double probability) {
    return java.util.concurrent.ThreadLocalRandom.current().nextDouble() < probability;
}


private static final double PERCENT13 = 13/100.0

然后,在其他一些代码上,您可以执行以下操作:

if (getRandomTrue(PERCENT13)) {
    // do someting 13% of the time....
}
于 2013-11-05T15:26:43.977 回答