Как смоделировать класс ServiceLoader в Java - PullRequest
0 голосов
/ 21 сентября 2018
public class ServiceLoaderDemo {

    public CPService demo() {
        ServiceLoader<CPService> serviceLoader = ServiceLoader.load(CPService.class);
        return iterate(serviceLoader);
    }

    public CPService iterate(ServiceLoader<CPService> serviceLoader) {
        CPService nonDefault = null;
        for (CPService cpService : serviceLoader) {
            cpService.show();
            if(!cpService.isDefault())
            {
                nonDefault = cpService;
            }
        }
        return nonDefault;
    }
}

Мне нужно написать модульные тесты для метода итерации в следующих случаях:

  1. служба по умолчанию и служба не по умолчанию
  2. только служба по умолчанию
  3. только служба не по умолчанию
  4. более одной службы не по умолчанию

Я попытался смоделировать класс ServiceLoader следующим образом:

import static org.fest.reflect.core.Reflection.method;
import static org.powermock.api.mockito.PowerMockito.mock;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ServiceLoader;

import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import junit.framework.TestCase;

@RunWith(PowerMockRunner.class)
@PrepareForTest(ServiceLoader.class)
public class ServiceLoaderDemoTest extends TestCase {
    private ServiceLoaderDemo serviceLoaderDemo = new ServiceLoaderDemo();

    public void testIterate() {
        final ServiceLoader mockServiceLoader = mock(ServiceLoader.class);
        IteratorDummy iterator = new IteratorDummy();
        iterator.cpServices.add(new CPServiceImplTwo());
        iterator.cpServices.add(new CPServiceImplOne());

        PowerMockito.when(mockServiceLoader.iterator()).thenReturn(iterator);
        CPService methodToTest = null;
        try {
            methodToTest = method("iterate").withReturnType(CPService.class).withParameterTypes(ServiceLoader.class).in(serviceLoaderDemo).invoke(mockServiceLoader);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        assertEquals(methodToTest.getClass(), ServiceLoaderDemoTest.class);
    }
}

class IteratorDummy implements Iterator<CPService> {
    public List<CPService> cpServices = new ArrayList<>();

    @Override
    public boolean hasNext() {
        return cpServices.iterator().hasNext();
    }

    @Override
    public CPService next() {
        CPService service = cpServices.iterator().next();
        return service;
    }
}

Этовыбрасывает исключение NullPointerException.Я не могу написать модульные тесты для этого.пожалуйста, помогите мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...