Вызывается в Always Null - PullRequest
       8

Вызывается в Always Null

0 голосов
/ 06 сентября 2018

У меня следующий Java-код, используемый для повторения определенного действия

package helpers;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public final class Retry {

    public static <V> V execute(Callable<V> action, Duration retryInterval, int retryCount)
        throws AggregateException {

        List<Throwable> exceptions = new ArrayList<>();
        for (int retry = 0; retry < retryCount; ++retry) {

            try {
                if (retry > 0)
                    Thread.sleep(retryInterval.toMillis());
                return action.call();

            } catch (Throwable t) {
                exceptions.add(t);
            }
        }
        throw new AggregateException(exceptions);
    }

    public static <V> Future executeAsync(Callable<V> action, Duration retryInterval, int retryCount)
        throws AggregateException {

        FutureTask<V> task = new FutureTask<>(action);
        ExecutorService executor = Executors.newSingleThreadExecutor();
        return executor.submit(task);
    }
}

Я пытаюсь проверить работоспособность синхронного кода с помощью

package helpers;

import org.junit.Before;
import org.junit.Test;

import java.text.MessageFormat;
import java.time.Duration;
import java.util.concurrent.Callable;

import static org.junit.Assert.assertEquals;

public class RetryTest {

    private Integer counter = 0;
    private Callable<Integer> calculator;

    @Before
    public void init() {
        calculator = () -> {
            for (int i = 0; i < 3; ++i) {
                counter++;
                System.out.println(MessageFormat.format(
                    "Counter = {0}", Integer.toString(counter)));
            }
            if (counter < 6)
                throw new Exception();
            return counter;
        };
    }

    @Test
    public void execute() throws AggregateException {

        Integer result = Retry.execute(calculator, Duration.ofSeconds(1), 3);
        assertEquals(9, java.util.Optional.ofNullable(result));
    }
}

Но calculator равно нулю в Retry.execute(calculator, Duration.ofSeconds(1), 3);, почему и что я здесь не так делаю?

Я использую Junit 4.12.


Я также попробовал полный синтаксис

@Before
    public void init() {
        calculator = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                for (int i = 0; i < 3; ++i) {
                    counter++;
                    System.out.println(MessageFormat.format(
                        "Counter = {0}", Integer.toString(counter)));
                }
                if (counter < 6)
                    throw new Exception();
                return counter;
            }
        };
    }

все еще ноль.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Можете ли вы проверить с этим тестовым кодом?

public class RetryTest {


    @Test
    public void execute() throws AggregateException {

        Integer result = Retry.execute(getCallableCalculater(), Duration.ofSeconds(1), 3);
        assertEquals(9, java.util.Optional.ofNullable(result));
    }

    private Callable<Integer> getCallableCalculater() {

        final Integer[] counter = {0};
        return () -> {
            for (int i = 0; i < 3; ++i) {
                counter[0]++;
                System.out.println(MessageFormat.format(
                        "Counter = {0}", Integer.toString(counter[0])));
            }
            if (counter[0] < 6)
                throw new Exception();
            return counter[0];
        };
    }
}
0 голосов
/ 06 сентября 2018

Ну, я проверял, используя JUnit 3 и @Before никогда не вызывается. Затем я проверил с JUnit 4 и @Before вызывается, попробуйте увидеть ваши версии JUnit.

...